java泛型,未经检查的警告

这是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 just List?

这样编译器就可以在编译时捕获上面的错误,而不是运行时.这是泛型的主要观点.

Why in this code instead of elArray = new ListaConPI[numVertices+1] wouldnt we write elArray = new ListaConPI<Adyacente>[numVertices+1]?

因为您无法实例化泛型类型的数组(尽管您可以将此类数组声明为变量或方法参数).见this earlier answer of mine to the same question.

上一篇:我无法在Java中找到“未检查或不安全操作”警告的原因


下一篇:为什么javac抱怨与类的类型参数无关的泛型?