繁体   English   中英

泛型 class 的泛型构造函数

[英]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 来实例化,因为不能保证特定类的构造函数只采用该确切类型的一个参数。

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

您仍然需要能够从U类型之一构造T类型的 object,因此提供转换器 function。 请注意,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);
    }
}

可能还有其他原因需要将此功能封装在未显示的 class 中,但您可能不需要 class,例如ConsumerTest 只需创建函数。

Function<String, StringBuilder> ctS = StringBuilder::new;

或者您可能根本不需要关心这些功能。 直接创建可变对象。

StringBuilder sb = new StringBuilder("Hello");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM