我有一段带有泛型的代码片段,它被剥离到其核心,看起来像这样。有简单的通用接口(interface)
public interface Doubler<T> {
T doubling (T param);
}
并且有工厂方法返回该接口(interface)的不同实例
public class DoublerFactory {
public static void main(String[] args) {
Doubler<String> input = produceDoubler("String");
System.out.println(input.doubling(args[0]));
}
public static <T> Doubler<T> produceDoubler(String type) {
Doubler result;
switch (type) {
case "Integer" : result = new IntDoubler(); break;
case "Float" : result = new FloatDoubler(); break;
case "String" : result = new StringDoubler(); break;
default: result = null;
}
return result;
}
static class IntDoubler implements Doubler<Integer> {
@Override
public Integer doubling(Integer param) {
return param*2;
}
}
static class FloatDoubler implements Doubler<Float> {
@Override
public Float doubling(Float param) {
return param*2;
}
}
static class StringDoubler implements Doubler<String> {
@Override
public String doubling(String param) {
return param + param;
}
}
}
除了工厂方法“productDoubler”中的最后一行产生“未经检查的分配”警告之外,一切正常。我实际上明白为什么 - 我不明白的是如何编写这个代码片段,以便 Java 编译器对赋值完全满意。
最佳答案
public static <T> Doubler<T> produceDoubler(String type) {
这个签名表示有人可以调用 produceDoubler
适用于任何类型 T
调用者想要,完全,无论 type
,和produceDoubler
可以返回适当的 Doubler。当然,不能。但这可能会做一些愚蠢的事情,比如
Doubler<Color> doubler = produceDoubler("Integer");
这当然没有意义。没有任何合理的方法可以使颜色加倍,并且类型和字符串之间没有关系。
让编译器满意的唯一方法是返回 Doubler<?>
,但这当然会迫使您在尝试使用 Doubler
时进行不安全的转换。 。
实际上没有一种类型安全的方法来做到这一点——连接任意 String
s 到不同的类型。唯一类型安全的替代方案是取出 switch
-- 在顶层做类似的事情
switch (type) {
case "Double": {
Doubler<Double> doubler = new DoubleDoubler();
// use the doubler for everything you need to use it for
}
...
}
...无需在任何时候尝试存储非具体类型的加倍器。
关于java - 避免 Java 中泛型的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34687423/