泛型类的泛型构造函数



我有一个泛型类ConsumerTest<T, U>,我计划T是可变类型,U是像<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不是类型。为了创建一个类的实例,你需要知道它的类型,而在这个上下文中你不需要知道。

另一个答案表明,new T(u)语法无效。不能将类型形参用作新类的实例化,因为不能保证特定类的构造函数只接受该类型的一个实参。

此外,您还创建了一个泛型构造函数,该构造函数定义了自己的TU,它们遮蔽了TU的类声明。这就是为什么您会得到编译器错误消息,例如"不能将T转换为T"。从构造函数中删除TU的声明,但不从类中删除。

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

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");

最新更新