Java 泛型类的泛型构造函数
我有一个泛型类Java 泛型类的泛型构造函数,java,generics,Java,Generics,我有一个泛型类ConsumerTest,我计划T是可变类型,U是ekvivalent不可变类型,比如,,。。。如何编写从immutable创建可变类型的泛型构造函数?以下是我的尝试: import org.apache.commons.lang3.mutable.MutableDouble; import org.apache.commons.lang3.mutable.MutableInt; class ConsumerTest<T, U> { private T value;
ConsumerTest
,我计划T
是可变类型,U
是ekvivalent不可变类型,比如
,
,
。。。如何编写从immutable创建可变类型的泛型构造函数?以下是我的尝试:
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);
}
}
import org.apache.commons.lang3.mutable.MutableDouble;
导入org.apache.commons.lang3.mutable.MutableInt;
类消费者测试{
私人T值;
公共消费者测试(U){
this.value=newt(u);//编译错误
}
公共静态void main(字符串[]args){
ConsumerTest ctS=新的ConsumerTest(“你好”);
消费者测试ctI=新消费者测试(666);
ConsumerTest ctD=新的ConsumerTest(11.11);
}
}
新T(u)
无效,因为T
不是类型。为了创建类的实例,您需要知道类型,但在该上下文中不知道。另一个答案指出,newt(u)
是无效语法。不能将类型参数用作新类来实例化,因为不能保证该特定类的构造函数只接受该确切类型的一个参数
此外,您还创建了一个泛型构造函数,该构造函数定义了自己的T
和U
,它隐藏了类的T
和U
声明。这就是为什么会出现编译器错误消息,如“无法将T转换为T”。从构造函数中删除T
和U
的声明,但不要从类中删除
您仍然需要能够从U
类型之一构造T
类型的对象,因此提供一个转换器函数。请注意,Java内置的函数
s颠倒了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);
}
}
或者,您可能根本不需要为函数而烦恼。直接创建可变对象
StringBuilder sb = new StringBuilder("Hello");
您不能以这种方式动态构造泛型类型请考虑传入一个充当构造函数的
java.util.Function
。回答得很好,谢谢您的帮助。现在一切都好了。
StringBuilder sb = new StringBuilder("Hello");