2013-04-18 17 views
8

私は、リターンクラスに基づいてジェネリック型を推論し、そのジェネリック型の静的メソッドを呼び出すメソッドを作ることができるかどうかを理解しようとしています。Java - 汎用静的メソッド

つまり、私は2つのクラスを作成し、どちらもgetInstancesメソッドとgetAllInstancesメソッドを実装しています。次に、ジェネリックラッパーからメソッドを作成しようとします。スーパークラスメソッドは戻り値の型に関係なく常に実行されているようです。例えば

public class ParentClass { 

    public ParentClass(){} 

    public static <T extends ParentClass> T getInstance(){ 
     return (T) new ParentClass(); 
    } 

    public static <T extends ParentClass> List<T> getAllInstances(){ 
     ArrayList<ParentClass> parents = new ArrayList<ParentClass>(); 

     for(int i=0;i<5;i++){ 
      parents.add(new ParentClass()); 
     } 

     return (List<T>) parents; 
    } 

} 

SubclassA

public class SubclassA extends ParentClass{ 

    public SubclassA(){} 

    @SuppressWarnings("unchecked") 
    public static SubclassA getInstance(){ 
     return new SubclassA(); 
    } 

    @SuppressWarnings("unchecked") 
    public static List<SubclassA> getAllInstances(){ 
     ArrayList<SubclassA> parents = new ArrayList<SubclassA>(); 

      for(int i=0;i<5;i++){ 
      parents.add(new SubclassA()); 
      } 

     return parents; 
     } 
} 

ラッパー - ラッパーを実行しているとき、私は次のエラーを取得問題

public class Wrapper { 

    public Wrapper(){ 
     // ... some other stuff 
    } 

    public <T extends ParentClass> T getInstance(){ 
     return T.getInstance(); 
    } 

    public <T extends ParentClass> List<T> getAllInstances(){ 
     return T.getAllInstances(); 
    } 

    public static void main(String... args){ 
     Wrapper wrapper = new Wrapper(); 

     SubclassA subclassA = wrapper.getInstance(); 
     ParentClass parentClass = wrapper.getInstance(); 

     System.out.println(subclassA.getClass().getName()); 
     System.out.println(parentClass.getClass().getName()); 
    } 

} 

表示:

例をスレッド "main"でception java.lang.ClassCastException:ParentClassをSubclassAにキャストすることができません Wrapper.main(Wrapper.java:20)

Javaでこれを実行できますか?

+0

あなたがここで期待していることを理解できません....あなたはクラスで静的メソッドを呼び出しています。実行されます。呼び出しをサブクラスに委譲する理由は何ですか?どのように決定するか? – Gab

+0

戻り値の型から推論することにより、どのサブクラスに委譲するかを決定することができたのではないでしょうか。 ここでは、わかりやすい静的メソッドをオーバーライドできないことを理解しています。 – user2294382

答えて

1

あなたのアプローチは間違っています。継承は常にオブジェクトレベルのコンテキスト内にあるため、Javaでは静的な意味はありません。Inheritance適切なアクセス修飾子を持つサブクラスによってメンバメソッド(非静的)のみ継承できます。

更新: さらに、あなたのシナリオでは、ファクトリパターンは、特定のクラスオブジェクトを取得/構築するためのジェネリック調整よりも適しているようです。

2

静的メソッドはstatic方法override.ThisではありませんでしょうClassレベルに

1

に属しいいえ、あなたはこのようにそれを行うことはできません。それを動作させるために、あなたは、Classオブジェクトを渡すことができます。

public class ParentClassUtils 

    public static <T extends ParentClass> T getInstance(Class<T> clazz) { 
     return clazz.newInstance(); 
    } 

    public static <T extends ParentClass> List<T> getAllInstances(Class<T> clazz) { 
     List<T> list = new ArrayList<T>(); 
     for (int i = 0; i < 5; i++) { 
      list.add(getInstance(clazz)); 
     } 
     return list; 
    } 
} 

はまた、あなたの例では、親クラスとサブクラスで同等の静的メソッドを持っています。サブクラスのメソッドは親クラスのメソッドをオーバーライドしません。単にそれらを隠すだけです。これはあなたが望むものではありません。このユーティリティクラスのアプローチはこれを回避します。

関連する問題