2016-03-20 16 views
3

昨日、タイプパラメータで静的メソッドを呼び出すことができたことを知りました。例:なぜタイプパラメータで静的メソッドを呼び出すことが可能ですか?

public static <T extends Arrays> void main(String[] args) { 
    T.sort(args); 
} 

これを許可する理由はありますか?何らかの形で非ジェネリックコードからジェネリックコードへの移行を手助けしたのでしょうか?

+2

いいえ、これを許可する理由はありません。それはあなたが思うように動作しません(常に、型の上限で静的メソッドを呼び出すでしょう;たとえ 'T'が' Arrays'を拡張したとしても、ここでも 'Arrays.sort'を得るでしょう)。 –

+0

私はこれを知っている(http://stackoverflow.com/a/36095702/3973077)。それがまったく役に立たないことを考えると、Sunはなぜ迷惑をかけるのだろうか?それはちょうど奇妙です。 –

+0

@LouisWassermanが正しいです。このコードは 'Arrays.sort(args)'と同じです。静的メソッドをサブクラスでオーバーライドすることはできません。自宅でこれを試してはいけません。 – Bohemian

答えて

2

明示的に許可されたものではないと思われますが、単に許可されていないとは限りません。

JLS 8.4.4 Generic Methodsは、型変数の使用を禁止していません。 Tを使用することはできません

JLS 8.1.2 Generic Classes and Type Parametersリスト:

次のいずれかの一般的なクラスCの型パラメータを参照するには、コンパイル時のエラーです:

  • Cのstaticメンバーの宣言(§8.3.1.1§8.4.3.2§8.5.1)。
  • C.内にネストされた任意の型宣言のstatic部材の宣言
  • Cの静的初期化子(§8.7)、又は
C.内にネストされた任意のクラス宣言の静的初期化子

基本的に、型変数は、特に指定のない限り、型が許可されている場所であればどこでも許可され、staticメソッド呼び出しをリストしませんでした。

慎重にまたは監視していますか?誰が知っている、しかし、おそらく熟考。インスタンス変数に対して静的メソッドを呼び出すことは許可されているので、これも許可しないでください。許されているからといって、あなたがそれをやるべきではありません。

それ(強調鉱山)と言うJLS 4.4 Type Variablesとおり可変

タイプ、クラス、インタフェース、メソッド、およびコンストラクタ体タイプとして使用する修飾されていない識別子あります。

+0

私は 'T.class'が明示的に除外されている場所を探しています。 –

+0

私はこれがどのように問題に関連しているのか本当に分かりません。 8.4。4は、一般的な方法の定義について論じている。 8.1.2では、(クラスのための)型パラメータの使い方とその静的コンテキストでの使用方法について説明しています(http://stackoverflow.com/questions/936377/static-method-in-a-ジェネリッククラス)。 4.4は質問とは完全に独立した型変数の定義にすぎません。それらの記事のどれも質問に関連していません。 – Obicere

+1

@PaulBoddington [JLS 15.8.2クラスリテラル](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.8.2):*これはコンパイルです指定された型が型変数である場合には、エラーが発生します* – Andreas

関連する問題