2017-07-26 9 views
0

ここに私のコードです。私は、共通の機能を定義する基本インターフェースを持っています。ジェネリックとインターフェイスを実装し、両方のメソッドが同じ消去を持っています

interface BaseInterface<T> { 
     void baseFunc(T param) 
    } 

    interface MyInterface1 extends BaseInterface<MyEntity1> { 
     void func1() 
    } 

    interface MyInterface2 extends BaseInterface<MyEntity2> { 
     void func2() 
    } 

そして、私のクラスは次のとおりです。

abstract class BaseClass implements BaseInterface<T> { 
     // ...some common things 
    } 

    class ClassA extends BaseClass implements MyInterface1 { 
     @Override 
     public void func1() {...} 

     @Override 
     public void baseFunc(MyEntity1 param) {...} 
    } 

    class ClassB extends BaseClass implements MyInterface2 { 
     @Override 
     public void func2() {...} 

     @Override 
     public void baseFunc(MyEntity2 param) {...} 
    } 

別のクラス別の豆MyEntity1とMyEntity2で同じことを行うために行います。だからgenericFでbaseFunc()を定義しました

しかし、ここに問題があります。 "両方のメソッドが同じ消去を持っているにもかかわらず、他のbaseFunc(T)およびbaseFunc(MyEntity1)をオーバーライドしません..."

この問題をスローするには?

ところで、ジェネリックを削除して、baseFuncをMyInterface1とMyInterface2に移動すると正常に動作します。しかし、私はそれが最良の方法だとは思わない。 Tは実際のクラスでない限り

+2

「抽象クラスBaseClassはBaseInterfaceを実装しています。」の何かが間違っています。 「T」とは何ですか? – shmosel

+0

そうですね、私は自分のコードを見直して、これを見つけました。抽象クラスBaseClassのはがにClassAはClassBのは、BaseClassのを拡張BaseClassのクラスを拡張BaseInterface クラスを実装する抽象クラスBaseClassのにBaseInterface 変更を実装 –

+0

@OscarZhang私はあなたのコメントに気づい前に申し訳ありませんが、私は私の答えを入力しました。それはあなたのために働いたのですか?もしそうなら、あなたはあなたのコメントを回答に変換することができます。その場合、私は私のものを削除します。あなたのコメントと私の答えは基本的に同じことを言っているからです。 –

答えて

5

宣言

abstract class BaseClass implements BaseInterface<T> 

は、意味をなさない。それは一般的なインタフェースを実装するなら、それはいずれか

  • に必要ジェネリッククラスは、または
  • は、ジェネリック型パラメータの代わりに型引数を指定すること。私はあなたが実際に書きたいものを信じる

は、一般的なクラスとしてBaseClass保つために

abstract class BaseClass<T> implements BaseInterface<T> 

ました。あなたはその後、その後baseFuncメソッドに渡されたタイプの無衝突はないだろう

class ClassB extends BaseClass<MyEntity2> implements MyInterface2 

class ClassA extends BaseClass<MyEntity1> implements MyInterface1 

として他のクラスを宣言することができます。

+0

はい、これは動作します。ありがとうございました〜 –

関連する問題