web-dev-qa-db-ja.com

ジェネリックパラメーターを使用したメインメソッド。なぜ機能するのですか?

public static <T extends String> void main(T[] args) {
    System.out.println("Hello World!");
}

上記のコードスニペットが正常にコンパイルおよび実行されるかどうかを知りたいと思いましたが、実際に実行されます!ただし、T extends StringT extends String & AutoClosableに置き換えられた場合はどうなるのかと思いました。 StringAutoClosableを実装しないため、これが正常に実行されるとは思っていませんでしたが、まだ実行されます!

public static <T extends String & AutoCloseable> void main(T[] args) {
    System.out.println("This still works!");
}

だから私の質問は、なぜこれがまだ正常に実行されるのですか?

  • 私はこれをJava 10.0.1でテストしています
  • Intellijは、プログラムへのエントリポイントとして認識されないため、この方法でNiceを再生しません。他のIDEではテストしていません。
  • 他のプログラムと同じように、コマンドラインを使用して引数を渡すこともできます。
35
Jacob G.

これは、型パラメーターに境界があるためです。

<T extends String>                  =>  String

<T extends String & AutoCloseable>  =>  String & AutoCloseable

また、消去後のバイトコードは、どちらの場合も通常のmain宣言の場合と同じです。

public static main([Ljava/lang/String;)V

JLS§4.4。型変数:

境界内の型の順序は、型変数の消去がその境界の最初の型によって決定され、クラスタイプまたはタイプ変数は、最初の位置にのみ表示されます。

31