public static <T extends String> void main(T[] args) {
System.out.println("Hello World!");
}
上記のコードスニペットが正常にコンパイルおよび実行されるかどうかを知りたいと思いましたが、実際に実行されます!ただし、T extends String
がT extends String & AutoClosable
に置き換えられた場合はどうなるのかと思いました。 String
はAutoClosable
を実装しないため、これが正常に実行されるとは思っていませんでしたが、まだ実行されます!
public static <T extends String & AutoCloseable> void main(T[] args) {
System.out.println("This still works!");
}
だから私の質問は、なぜこれがまだ正常に実行されるのですか?
注:
これは、型パラメーターに境界があるためです。
<T extends String> => String
<T extends String & AutoCloseable> => String & AutoCloseable
また、消去後のバイトコードは、どちらの場合も通常のmain
宣言の場合と同じです。
public static main([Ljava/lang/String;)V
境界内の型の順序は、型変数の消去がその境界の最初の型によって決定され、クラスタイプまたはタイプ変数は、最初の位置にのみ表示されます。