java - 避免 Java 中泛型的警告

标签 java generics

我有一段带有泛型的代码片段,它被剥离到其核心,看起来像这样。有简单的通用接口(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/

相关文章:

java - 匹配标签之间的字符串:

Java,扩展类或实例化时出现 StackOverflowError

c# - 多线程同步列表<T>

java - 如何为具有泛型方法的功能接口(interface)创建 lambda 表达式

c# - List<T>.Contains 未显示过载

java - 将泛型数组传递给采用泛型数组的方法

java - MathTransform 在 Android 项目中不起作用 : "The type java.awt.geom.Point2D$Double cannot be resolved."

java - Servlet 分析

java - 方法不能应用于给定类型。希望得到帮助

java - 进行通用数据流转换