我有通用类ConsumerTest<T, U>
和我的计划,T
是可变的类型,U
是ekvivalent不变型像<StringBuilder, String>
,<MutableInt, Integer>
,<MutableDouble, Double>
,...我怎么能写从一成不变的创建可变类型的通用构造?这是我的尝试:
import org.apache.commons.lang3.mutable.MutableDouble;
import org.apache.commons.lang3.mutable.MutableInt;
class ConsumerTest<T, U> {
private T value;
public <T, U> ConsumerTest(U u) {
this.value = new T(u); // compile error
}
public static void main(String[] args) {
ConsumerTest ctS = new ConsumerTest<StringBuilder, String>("Hello");
ConsumerTest ctI = new ConsumerTest<MutableInt, Integer>(666);
ConsumerTest ctD = new ConsumerTest<MutableDouble, Double>(11.11);
}
}
另一个答案new T(u)
是无效语法。不能将类型参数用作实例化的新类,因为不能保证该特定类的构造函数只使用该类型的一个实参。
此外,您还创建了一个通用的构造函数,该构造函数定义了自己的 T
和U
,该构造函数遮蔽了类的T
和的声明U
。这就是为什么您会收到诸如“无法将T转换为T”之类的编译器错误消息的原因。从构造函数中删除声明,T
并U
从类中删除声明。
您仍然需要能够T
从type中的一个构造类型的对象U
,因此提供转换器功能。这里注意,Java的内置在Function
小号逆转的感觉U
和T
你有。
class ConsumerTest<T, U> {
private T value;
public ConsumerTest(U u, Function<U, T> converter) {
this.value = converter.apply(u);
}
public static void main(String[] args) {
ConsumerTest ctS = new ConsumerTest<StringBuilder, String>("Hello", StringBuilder::new);
ConsumerTest ctI = new ConsumerTest<MutableInt, Integer>(666, MutableInt::new);
ConsumerTest ctD = new ConsumerTest<MutableDouble, Double>(11.11, MutableDouble::new);
}
}
您可能有其他一些原因需要将此功能封装在一个未显示的类中,但是您可能不需要这样的类ConsumerTest
。只需创建功能。
Function<String, StringBuilder> ctS = StringBuilder::new;
或者,您可能根本不需要理会这些功能。直接创建可变对象。
StringBuilder sb = new StringBuilder("Hello");
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句