在运行时插入不同的Object,Generics JAVA

时间:2012-03-06 23:49:35

标签: java generics

当我遇到这一点时,我正在学习JAVA中的泛型:

  

通用类型检查仅在编译时完成。修改代码以在运行时插入其他实例是一个坏主意。

我不知道足够的Java来调整代码来在运行时执行此操作。可能反思?因此,我无法尝试看看会发生什么。所以,我的问题是,如果完成上述工作,会发生什么?为什么以及如何不好?

2 个答案:

答案 0 :(得分:4)

你会得到ClassCastException。考虑这个例子(不做什么):

List<Integer> intList = new ArrayList<Integer>();
List asRaw = intList; // Bad! Your compiler will complain / warn. Don't ignore it.
asRaw.add("not a number");
Integer myInt = intList.get(0); // ClassCastException

这是因为泛型在编译时被删除 - 也就是说,在内部,ArrayList只知道它有一堆Object s。 (Google for Java擦除了很多关于此的信息。)编译时泛型转变为运行时强制转换,如果你的泛型使用是安全的,它可以保证工作(没有原始类型,没有参数化类型数组,没有反射放入糟糕的价值观)。如果您的使用不安全(如上例所示),则强制转换可能会失败,从而导致ClassCastException。实际上,这可能会发生在与放置不良价值的区域相差甚远 - 甚至远离它被取出的地方 - 因此很难追踪。

答案 1 :(得分:4)

无需反思:

import java.util.*;

public class Test {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<String>();        
        Object tmp = strings;

        // Unsafe cast
        List<Integer> integers = (List<Integer>) tmp;
        integers.add(10);

        String x = strings.get(0); // Bang! (ClassCastException)
    }
}

发出警告,但它仍然是有效的代码。如果你是微妙的话,可能有一些方法可以在没有警告的情况下实现类似的事情......只是不要这样做。

上面显示了“将会发生什么”的答案:你会得到一个例外,但可能比你预期的要晚。当你尝试使用流氓元素时,你会得到异常,因为那时会有一个演员。