[英]Generic constructor of generic class
我有通用的 class ConsumerTest<T, U>
并且我计划T
是可变类型,而U
是像<StringBuilder, String>
, <MutableInt, Integer>
, <MutableDouble, Double>
一样的ekvivalent不可变类型从不可变创建可变类型的通用构造函数? 这是我的尝试:
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
不是类型。 为了创建 class 的实例,您需要知道类型,而在这种情况下您不需要。
正如另一个答案所述, new T(u)
是无效的语法。 不能将类型参数用作新的 class 来实例化,因为不能保证特定类的构造函数只采用该确切类型的一个参数。
此外,您还创建了一个泛型构造函数,它定义了自己的T
和U
,它们隐藏了类的T
和U
声明。 这就是您收到诸如“无法将 T 转换为 T”之类的编译器错误消息的原因。 从构造函数中删除T
和U
的声明,而不是从 class 中删除。
您仍然需要能够从U
类型之一构造T
类型的 object,因此提供转换器 function。 请注意,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);
}
}
可能还有其他原因需要将此功能封装在未显示的 class 中,但您可能不需要 class,例如ConsumerTest
。 只需创建函数。
Function<String, StringBuilder> ctS = StringBuilder::new;
或者您可能根本不需要关心这些功能。 直接创建可变对象。
StringBuilder sb = new StringBuilder("Hello");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.