鋳造他のいくつかのクラスがこの 型情報のないクラスに対してコンパイルされたときにはありません、キャストがクラス自体のコンパイルフェーズ中に実行される
、後に発生します。
コンパイルされたクラスは、依存するクラスに応じて変更すべきではありません。この方法で
ルック:
public void doSomething();
Code:
0: new #15 // class java/util/ArrayList
3: dup
4: invokespecial #17 // Method java/util/ArrayList."<init>":()V
7: astore_1
8: aload_1
9: iconst_1
10: invokestatic #18 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
13: invokeinterface #24, 2 // InterfaceMethod java/util/List.add:(Ljava/lang/Object;)Z
18: pop
19: aload_1
20: iconst_0
21: invokeinterface #30, 2 // InterfaceMethod java/util/List.get:(I)Ljava/lang/Object;
26: checkcast #19 // class java/lang/Integer
29: astore_2
30: return
キャストが実際にコンパイラによって追加された:ここで
public class TestCast {
public void doSomething(){
List<Integer> values = new ArrayList<>();
values.add(1);
Integer value = values.get(0);
}
}
は(javap
ツールを使用して行われる)TestCast
コンパイルされたクラスの解体方法であります:
26: checkcast #19 // class java/lang/Integer
ありがとう。したがって、キャストは実際にはジェネリッククラスではなくユーザークラス内にあります。また、上記の例を参照して、リストを指定した場合、明示的に挿入されたStringへのキャストはJavaコンパイラによって自動的に挿入されます。 –
Searcherer
@Searchererはい、キャストはユーザーのクラスにあります。 'ArrayList'の型パラメータの消去は' Object'ですが、あなたがより具体的な型を必要とするユーザクラスでのみ、それがキャストする場所です。そして、そうです、そのキャストは 'ArrayList'の場合に自動的に挿入されます。 'add'メソッドのキャストはないことに注意してください。 –
ありがとうございました。最後の小さなことを聞きたいだけです。addメソッドのキャストがないことに注意して、コンパイラは引き続きaddのシグネチャに対して与えられた引数を入力します。これは型パラメータに基づいて異なる可能性があります。 。右? – Searcherer