泛型类的泛型构造函数

时间:2021-01-22 18:10:20

标签: java generics

我有泛型类 ConsumerTest<T, U>,我计划 T 是可变类型,U 是 ekvivalent 不可变类型,如 <StringBuilder, String><MutableInt, Integer>、{{1 }}, ...如何编写从不可变类型创建可变类型的泛型构造函数?这是我的尝试:

<MutableDouble, Double>

2 个答案:

答案 0 :(得分:2)

new T(u) 无效,因为 T 不是类型。为了创建一个类的实例,你需要知道类型,而你在那个上下文中并不知道。

答案 1 :(得分:0)

正如另一个答案所述,new T(u) 是无效语法。不能将类型参数用作要实例化的新类,因为不能保证该特定类的构造函数只采用该确切类型的一个参数。

此外,您还创建了一个泛型构造函数,该构造函数定义了其自己的 TU,它们隐藏了类的 T 和 {{ 1}}。这就是为什么您会收到诸如“无法将 T 转换为 T”之类的编译器错误消息的原因。从构造函数中删除 UT 的声明,而不是从类中删除。

您仍然需要能够从 U 类型之一构造 T 类型的对象,因此提供转换器函数。请注意,Java 内置的 U 与您拥有的 FunctionU 的含义相反。

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;