我有泛型类 ConsumerTest<T, U>
,我计划 T
是可变类型,U
是 ekvivalent 不可变类型,如 <StringBuilder, String>
、<MutableInt, Integer>
、{{1 }}, ...如何编写从不可变类型创建可变类型的泛型构造函数?这是我的尝试:
<MutableDouble, Double>
答案 0 :(得分:2)
new T(u)
无效,因为 T
不是类型。为了创建一个类的实例,你需要知道类型,而你在那个上下文中并不知道。
答案 1 :(得分:0)
正如另一个答案所述,new T(u)
是无效语法。不能将类型参数用作要实例化的新类,因为不能保证该特定类的构造函数只采用该确切类型的一个参数。
此外,您还创建了一个泛型构造函数,该构造函数定义了其自己的 T
和 U
,它们隐藏了类的 T
和 {{ 1}}。这就是为什么您会收到诸如“无法将 T 转换为 T”之类的编译器错误消息的原因。从构造函数中删除 U
和 T
的声明,而不是从类中删除。
您仍然需要能够从 U
类型之一构造 T
类型的对象,因此提供转换器函数。请注意,Java 内置的 U
与您拥有的 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;