2016-07-20 10 views
1

ジェネリックでいくつかの問題があります。 だから、ここで私が扱ってるものの簡易版である:サブクラス静的メソッドからジェネリックメソッドを呼び出す方法

私は1つの抽象クラスと2つのサブクラスがあります

public abstract class A {} 
public class B extends A {} 
public class C extends A {} 

私はそれらのクラスのための作家を書いている、と私は維持したいがすべての人が共通しているからです。しかし、私は、私はBWriterとCWriterでAWritingMethodを呼び出すことはできません、明らかにそれを

public abstract class AWriter<T extends A> { 
    public void AWritingMethod(T arg) {} 
} 
public class BWriter extends AWriter<B> { 
    public static void BWritingMethod(B arg) { 
    AWritingMethod(arg) 
    } 
} 
public class CWriter extends AWriter<C> { 
    public static void CWritingMethod(C arg) { 
    AWritingMethod(arg) 
    } 
} 

をインスタンス化せずにライターを呼び出すことができるようにしたいが、私はAWriterでの作業のほとんどを維持するためにそのような何かを行うことができますか、それでもBWritingMethodとCWritingMethodは静的に保ちますか?

ありがとうございました!

LD

+0

それはまったく意味がありません。 AWriter.AWritingMethodは、インスタンスを作成せずに呼び出すインスタンスメソッドです...これは不可能です。 – fabian

答えて

2

あなたは、次のようにコードを変更AWritingMethodstaticを追加することができます。

public abstract class AWriter<T extends A> { 
    public static void AWritingMethod(T arg) {} 
} 

public class BWriter extends AWriter<B> { 
    public static void BWritingMethod(B arg) { 
    AWriter.AWritingMethod(arg) 
    } 
} 

public class CWriter extends AWriter<C> { 
    public static void CWritingMethod(C arg) { 
    AWriter.AWritingMethod(arg) 
    } 
} 

か、このようなBWriterCWriterクラスの新しいインスタンスを使用して試すことができます:

public abstract class AWriter<T extends A> { 
    public void AWritingMethod(T arg) {} 
} 

public class BWriter extends AWriter<B> { 
    public static void BWritingMethod(B arg) { 
    new BWriter().AWritingMethod(arg); 
    } 
} 

public class CWriter extends AWriter<C> { 
    public static void CWritingMethod(C arg) { 
    new CWriter().AWritingMethod(arg); 
    } 
} 
+0

静的コンテキストからAWritingMethod(T) 'を参照することはできません。「静的メソッドではありません。」 – ldebroux

+0

Ifixed public static void AWritingMethod(T arg){}を静的メソッドに変換します。私はあなたが得たいと思う状況を知りたい。静的メソッドにnone staticメソッドを追加したい場合は、インスタンスとしてインスタンス化する必要があります。メソッドを静的にすることができます。 – Cenxui

+0

AWritingMethod staticはジェネリック型では動作しません。 2番目のオプションは動作しますが、ありがとう! – ldebroux

0

ロジックを別のクラス/メソッドに抽象化したい場合、最良の方法は次のようなことです。

class AWriter { 
    private AWriter() {} 
    static <T extends A> void AWritingMethod(T arg) {} 
} 

public class BWriter { 
    private BWriter() {} 
    public static <T extends B> void BWritingMethod(T arg) { 
    AWriter.AWritingMethod(arg) 
    } 
} 

public class CWriter { 
    private CWriter() {} 
    public static <T extends C> void CWritingMethod(T arg) { 
    AWriter.AWritingMethod(arg) 
    } 
} 

BWriterCWriterは、同じパッケージ内にある場合は結構ですAWriterが公開されていないことに注意してください、とプライベートコンストラクタは、静的のみのクラスのインスタンス化を防ぐために。これには、各静的メソッドにジェネリックを追加するためのもう少しの定型文が必要ですが、多くの選択肢はありません - you cannot use a classes generic types in a static context

関連する問題