2012-08-09 17 views
5

メソッドが静的な場合にのみジェネリックメソッドを使用するのですか?非静的な場合はジェネリッククラスを定義し、ジェネリックメソッドである必要はありません。あれは正しいですか ?例えばJava:ジェネリックメソッドは静的でしかありませんか?

public class Example<E>{ 

     //this is suffice with no compiler error 
     public void doSomething(E [] arr){ 
       for(E item : arr){ 
        System.out.println(item); 
       } 
     } 

     //this wouldn't be wrong, but is it necessary ? 
     public <E> doSomething(E [] arr){ 
       for(E item : arr){ 
        System.out.println(item); 
       } 
     } 
    } 

コンパイラは、静的だならば、一般的な方法にするために型パラメータを追加するために強制されます一方。

public static <E> doSomething(E [] arr){ 


    } 

私は正しいかどうかわかりません。

+4

ジェネリックインスタンスメソッドを使用して、クラスをジェネリックにすることもできます。 –

答えて

4

は、インスタンスのメソッドおよびフィールドの汎用タイプを定義します。

public void <E> doSomething(E [] arr){ 

これは最初に異なっていると混乱する可能性がある第二E定義します。

注:voidがまだ必要とされている。

静的フィールドとメソッドは、クラスのジェネリック型を使用しないでください)。

public static <F> doSomething(F [] arr) { } 

private static final List<E> list = new ArrayList<>(); // will not compile. 
+0

静的なフィールドとメソッドは、クラスのジェネリック型を使用しません。何故ですか ? – peter

+0

クラスのすべてのインスタンスは、異なるジェネリック型を持つことができます。静的メンバーには意味がありません。 –

+0

非静的なフィールドとメソッドはどうですか?彼らはクラスのジェネリック型を共有していますか?私は彼らがする必要があることを意味する? – peter

3

Example<String> example = new Example<String>();を宣言したとします。

  • public void doSomething(E [] arr)
  • public static <E> void doSomething(E [] arr)は、任意のタイプの配列を期待するであろう(それはExample<E>と同様Eない)任意の型の配列を期待するString[]引数
  • public <E> void doSomething(E [] arr)を期待する

いずれにしても、Example<E>をパラメータ化できるため、インスタンスに依存するため、静的呼び出しでそのEを使用することはできません。これは、静的メソッドから非静的メンバーを呼び出すようなものです。したがって、ローカルで再定義する必要があります。

+0

たとえば、「Example 」と「Example 」を作成できます。静的メソッドは、特定のインスタンスではなくクラスに関連しています。静的メソッドがいくつか存在する可能性があるので、 'E'を解決する方法はありません。 – assylias

+0

私の類推は、 'private String abc;'(インスタンスフィールド)を持っていれば、そのクラスのインスタンスごとに1つの 'abc'文字列があるので、静的メソッドからアクセスできないということです。 – assylias

+0

その場合、私はE以外の何かを使用しなければならないのですか? Eを使用すると、コンパイラエラーが発生しますか? '例'のようなジェネリッククラスの中に 'public static voidメソッド(E arg)'を書くと、ローカルで再定義することはどういう意味ですか – peter

0

java.util.Collectionインターフェイスを検討してください。 toArrayインターフェイス宣言から型パラメータEと全く関係がないタイプパラメータTを使用して一般的なインスタンスメソッドである

public interface Collection<E>{ 
    //... 
    <T> T[] toArray(T[] a); 
} 

:次のように宣言されます。

これは、ジェネリックインスタンスメソッドを持つことの価値を示すJDK自体の良い例です。

関連する問題