我有这个演示,我不需要具有重绘架构的特定解决方案,但只需了解为什么会这样以及我为避免它而遗漏的任何事情。我想知道为什么:
- 编译器允许将不是列表类型的元素插入到列表中
当我们尝试获取元素而不是推送它时抛出 ClassCast 异常
import Test.*; //Inner classes import java.util.List; import java.util.ArrayList; public class Test<E extends Object> { private List<E> list = new ArrayList<E>(); public Test() {} public static void main(String[] args) { Test<String> a = new Test<String>(); a.addElement(new String()); a.addElement(new Integer(0)); // No complain in comp/run-time, I dont understand why CastException is not thrown here String class1 = a.getElement(0); String class2 = a.getElement(1); //No complain in comp but ClassCastException: Integer cannot be cast to String //Integer class3 = a.getElement(1); //Compilation error } public void addElement (Object node) { list.add((E) node); } //No complain in comp/run-time public E getElement(int index) { return list.get(index); } }
有什么解决办法?注意我需要传递 SuperClass 而不是类型 E 的 addElement 行。这是我的架构所需要的,这只是一个简单的模拟演示。但无论如何,类型 E 的强制转换应该按照需要运行并在运行时抛出 CastExeption,不应该吗?