这是oracle页面教程的一部分:
请考虑以下示例:
List l = new ArrayList<Number>();
List<String> ls = l; // unchecked warning
l.add(0, new Integer(42)); // another unchecked warning
String s = ls.get(0); // ClassCastException is thrown
详细地说,当List对象l(其静态类型是List< Number>)被分配给具有不同静态类型的另一个List对象ls时,发生堆污染情况,List< String> //这是来自oracle教程
我的问题是为什么静态类型List< Number>而不仅仅是List?
后来另一个问题来自我的学习代码:
public class GrafoD extends Grafo {
protected int numV, numA;
protected ListaConPI<Adyacente> elArray[];
*/** Construye un Grafo con un numero de vertices dado*
* @param numVertices: numero de Vertices del Grafo
*/
@SuppressWarnings("unchecked")
public GrafoD(int numVertices){
numV = numVertices; numA=0;
elArray = new ListaConPI[numVertices+1];
for (int i=1; i<=numV; i++) elArray= new LEGListaConPI<Adyacente>();
}
为什么在这段代码而不是elArray = new ListaConPI [numVertices 1]我们不会写elArray = new ListaConPI< Adyacente> [numVertices 1]?
非常感谢 !
解决方法:
my question would be why is the static type
List<Number>
and not justList
?
这样编译器就可以在编译时捕获上面的错误,而不是运行时.这是泛型的主要观点.
Why in this code instead of
elArray = new ListaConPI[numVertices+1]
wouldnt we writeelArray = new ListaConPI<Adyacente>[numVertices+1]
?
因为您无法实例化泛型类型的数组(尽管您可以将此类数组声明为变量或方法参数).见this earlier answer of mine to the same question.