泛型类的泛型构造函数

彼得·塞兹姆斯基

我有通用类ConsumerTest<T, U>和我的计划,T是可变的类型,U是ekvivalent不变型像<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)是无效语法。不能将类型参数用作实例化的新类,因为不能保证该特定类的构造函数只使用该类型的一个实参。

此外,您还创建了一个通用的构造函数,该构造函数定义了自己的 TU,该构造函数遮蔽了类的T的声明U这就是为什么您会收到诸如“无法将T转换为T”之类的编译器错误消息的原因。从构造函数中删除声明,TU从类中删除声明

您仍然需要能够Ttype中的一个构造类型的对象U,因此提供转换器功能。这里注意,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");

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章