2017-08-13 19 views
2

汎用静的メソッドには戻り値型に加えて、インスタンスメソッドはありません。それはクラスレベルで既に定義されたジェネリック型パラメータを使用することができるので(静的汎用メソッドの戻り値型の前にがある必要があります

public class Main<T> { 
    public static <T> T met(T t) { 
     return t; 
    } 

    public T met1(T t) { 
     return t; 
    } 
} 
+3

いくつかの先行研究を試みましたか? – GhostCat

+0

'T'はどこにも定義されていないので、' met1'の宣言は不正です。 'T'はどこに定義されていますか?パッケージに 'T 'というクラスがありますか? – ajb

答えて

4

インスタンスメソッドはまた、戻り値の型の前にジェネリック型パラメータ(<T>)を定義することができ、それは必要がありませんpublic class Main<T>)。

一方、静的メソッドでは、クラスレベルで定義されたジェネリック型パラメータを使用できないため、使用するジェネリック型パラメータを宣言する必要があります。以下の両方、すなわち

は、いくつかのクラスまたはインタフェースの(すなわち、名前タイプ識別子であると仮定され、次の

public static T met(T t) { 
    return t; 
} 

Tで、一方

public static <T> T met(T t) { 
    return t; 
} 

public <T> T met1(T t) { 
    return t; 
} 

有効です)、ジェネリック型パラメータではありません。

+0

@GhostCatクラスが名前(T)のジェネリック型パラメータを宣言していない場合、Tはジェネリック型パラメータではなく、実際のクラスまたはインターフェイスの名前とみなされます。 – Eran

0

これには2つの側面がある:

A)静的がない一方

インスタンスメソッドが暗黙的にすべてのクラスタイプ・パラメータを取得するには。その理由は、コンパイル時に、それらの型パラメータに割り当てられた型が各オブジェクトインスタンス参照に固有であるため、静的メソッドには特定のインスタンスが関連付けられていないため決して適用されないからです。

B)

すべてのメソッド、インスタンスまたはクラスのものは、その方法に適用される追加のタイプのパラメータを定義することができます。これらは修飾子(publicstatic、...)と戻り値の型の間に置かれます。これは、Java言語開発者が任意に選択した構文です。彼らはそれを違う方法で行うことができましたが、それが使用される前に何かを宣言しなければならないのがより理にかなっています(たとえば、パラメータ型宣言で)。

3

まず、「追加」とは何かを理解する必要があります。戻り値の型には追加されません。それはあなたがパラメータ化された型に型引数として使用することができ 種類を制限したい場合があるかもしれません「Bounded Type Parameters

有界型パラメータです。 たとえば、数値に対して作用するメソッドは、 のNumberまたはそのサブクラスのインスタンスを受け入れるだけでよい場合があります。これは、束縛された 型パラメータのためのものです。

汎用クラス/メソッド/インターフェイスをコンパイルするとき。 Javaコンパイラはジェネリック型をJVMが理解できるコードに変換します。このプロセスはコールタイプ消去であり、汎用タイプのパラメータの境界を知る必要があります。すなわち、それは無制限で、<T extends Comparable<T>>Comparable


セカンドへの改宗を得るため<T> GETはObjectに変換し、一般的なインスタンスメソッドがないのに対し、なぜジェネリックstatic方法は、有界型パラメータを必要としていますか?

この種の問題は、クラスメソッドとインスタンスメソッドの違いに関係しています。

  • キーワードstaticを使用すると、このメソッドはクラスメソッドになります。つまり、インスタンスを作成せずに呼び出すことができます。それが問題です。 staticメソッドは、異なる型パラメータのインスタンスを含むクラスのすべてのインスタンス間で共有されるため、Javaは型をインスタンス化するまでTが何であるかを知りません。コンパイラにクラスメソッドが期待するインスタンスを明示的に伝える必要があります。

  • キーワードstaticを使用しない場合、このメソッドはインスタンスメソッドになりました。つまり、クラスのインスタンスを作成するまで、メソッドを呼び出すことはできません。インスタンスを作成するときは、型パラメータを指定する必要があります。 Javaコンパイラは、インスタンスメソッドを呼び出すときにその型パラメータを本質的に使用することができるため、バインドされた型パラメータはインスタンスメソッドではオプションです。

関連する問題