当我遇到这一点时,我正在学习JAVA中的泛型:
通用类型检查仅在编译时完成。修改代码以在运行时插入其他实例是一个坏主意。
我不知道足够的Java来调整代码来在运行时执行此操作。可能反思?因此,我无法尝试看看会发生什么。所以,我的问题是,如果完成上述工作,会发生什么?为什么以及如何不好?
答案 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)
}
}
发出警告,但它仍然是有效的代码。如果你是微妙的话,可能有一些方法可以在没有警告的情况下实现类似的事情......只是不要这样做。
上面显示了“将会发生什么”的答案:你会得到一个例外,但可能比你预期的要晚。当你尝试使用流氓元素时,你会得到异常,因为那时会有一个演员。