4

これはオラクルページのチュートリアルの一部です:

次の例を検討してください。

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<Number>詳細には、静的タイプがである List オブジェクト l が、別の静的タイプを持つ別の 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]でしょうか?

どうもありがとう !

4

3 に答える 3

3

私の質問は、なぜ静的タイプList<Number>であり、単なるではないのListですか?

コンパイラが実行時ではなく、コンパイル時にすでに上記のようなバグをキャッチできるようにします。これがジェネリックの要点です。

ではなく、なぜこのコードでelArray = new ListaConPI[numVertices+1]書くのelArray = new ListaConPI<Adyacente>[numVertices+1]でしょうか?

ジェネリック型の配列をインスタンス化できないためです (ただし、そのような配列を変数またはメソッド パラメーターとして宣言することはできます)。同じ質問に対する私の以前の回答を参照してください。

于 2011-08-10T10:28:11.030 に答える
0
List l = // something;

lの型は何ですか?それはリストであり、それはその静的タイプであり、古いリストである可能性があります。したがって、割り当てる場合

List<String> listOfString = l;

コンパイル時のコンパイラは、これが安全かどうかを判断できません。あなたが示す例は、それが安全ではないことを示しており、 ClassCastException が発生します。

于 2011-08-10T10:28:32.233 に答える
0

タイプ消去についてお読みください。ここで、型を消去した後でコードを再検討してください (最初の例のみを行います)。

List l = new ArrayList(); // Compiler remembers that it should check that only numbers can be added
List ls = l; // Compiler remembers that it should cast everything back to a String
l.add(0, new Integer(42)); // the compiler checks that the second parameter is a Number.
String s = ls.get(0); // The compiler casts the result back to a String, so you get an exception

同じ理由で、次のようなクラスを持つことはできません。

class A<T> {
    public void method(T obj) { }
    public void method(Object obj) { }
}
于 2011-08-10T10:29:11.250 に答える