6

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

例えば、

  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

3 に答える 3

4
public class Example<E>{

インスタンスのメソッドとフィールドのジェネリック型を定義します。

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

これはE、最初のものとは異なり、混乱する可能性が高い2番目のものを定義します。

注:voidまだ必要です;)

静的フィールドとメソッドは、クラスの汎用型を使用しません。

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

private static final List<E> list = new ArrayList<>(); // will not compile.
于 2012-08-09T14:18:51.713 に答える
3

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

  • public void doSomething(E [] arr)String[]引数を期待します
  • public <E> void doSomething(E [] arr)任意のタイプの配列を期待します(とは異なりEますExample<E>
  • public static <E> void doSomething(E [] arr)任意のタイプの配列を期待します

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

于 2012-08-09T14:20:30.087 に答える
1

java.util.Collectionインターフェイスについて考えてみましょう。それは次のように宣言されています:

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

これtoArrayは、型パラメーターを使用するジェネリックインスタンスメソッドであり、インターフェイス宣言Tの型パラメーターとはまったく関係がありません。E

これは、JDK自体からの良い例であり、汎用インスタンスメソッドを持つことの価値を示しています。

于 2012-08-09T14:21:00.797 に答える