1
public class G<x> {
  x i;
}

public class E {
  public static void main(String[] args) {
    G<Integer> b1 = new G<Integer>();
    G<String> b2 = new G<String>();
    b1.i = 50;
    b2.i = "start";
    System.out.println(b1.i);
    System.out.println(b2.i);
  }
}

このケースが以下に示す他のケースとどのように異なるか

public class G<x> {
  x i;
}

public class E {
  public static void main(String[] args) {
    G b1 = new G();
    G b2 = new G();
    b1.i = 50;
    b2.i = "start";
    System.out.println(b1.i);
    System.out.println(b2.i);
  }
}

Gクラスのオブジェクトを作成している間、ジェネリックの型引数を定義する必要がありますが、型引数を渡さなくても機能します..出力が表示されます。では、コードは Type 引数がなくても実行されるのに、Type 引数が重要であると先生が言うのはなぜですか。

どちらの場合にも違いがあります。最初のケースでは、参照変数 b1 を介して整数型の引数を渡し、b2 参照変数を介して文字列型の引数を渡しますが、2 番目のケースではこれを行いません。そして、これを行わないことにより、2番目のケースでは、データ型はオブジェクト型になります。どちらのコードでも同じ答えが得られますが、私の先生は常に 1case を使用する必要があると言っています。

4

2 に答える 2

1

私はあなたが実際にこれがコンパイルされることを意味していると思います:

G b1=new G();
G b2=new G();

b1.i=50;
b2.i="start";
System.out.println(b1.i);
System.out.println(b2.i);

これはたまたまPrintStream.printlnfor のオーバーロードとして機能するためObject、任意のオブジェクトを取ります。通常は、より興味深いメソッドを呼び出します。

ちなみにまだ差はあります。の独特な設計によりPrintStream、このコードは異なる処理を行います。

G b1=new G();
G<char[]> b2=new G<>();

b1.i="start".toCharArray();
b2.i="start".toCharArray();
System.out.println(b1.i);
System.out.println(b2.i);

警告が表示されます。通常、警告はエラーであるかのように扱います。

于 2013-06-06T22:32:02.003 に答える