web-dev-qa-db-ja.com

ジェネリックス:インターフェースを実装する抽象クラスから継承

私は次のインターフェースを持っています:

public interface SingleRecordInterface<T> {
    public void insert(T object);
}

以下の抽象クラスがあります(メソッドの挿入については触れていません)。

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {
}

具体的なクラスがあります:

public class SpecificEntry extends AbstractEntry {
    public void insert(SpecificEntryBean entry) {
        // stuff
    }
}

最後に、SpecificEntryBeanは次のように定義されます。

public class SpecificEntryBean extends AbstractEntryBean {
}

次のエラーがあります。

タイプSpecificEntryは、継承された抽象メソッドSingleRecordInterface.insert(AbstractEntryBean)を実装する必要があります

SpecificEntryBeanがAbstractEntryBeanを拡張していることを考えると、このエラーの理由がわかりません。このエラーを修正するにはどうすればよいですか?

20
Matt

抽象クラスもジェネリックにする必要があります:

public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}

次に、具体的なクラスについて:

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
}
35
Alex

次のように変更します。

public abstract class AbstractEntry<EB extends AbstractEntryBean> implements SingleRecordInterface<EB> {
}

そして

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
    public void insert(SpecificEntryBean entry) {
        // stuff
    }
}
3
Guillaume Polet

問題はあなたの宣言にあります

public abstract class AbstractEntry implements SingleRecordInterface<AbstractEntryBean> {}

これは、型パラメーターTの型引数(AbstracEntryBean)を定義する場所です。

したがって、TはAbstracEntryBeanであり、このメソッドをオーバーライドして最終的に実装する場合は、メソッドに正確なメソッドシグネチャを提供する必要があります。この場合:

@Override
public void insert(AbstractEntryBean object) {
    // TODO Auto-generated method stub
}

Javaは、特定のメソッドをオーバーライドするためにまったく同じメソッドシグネチャを必要とするため、.

他の人が示唆しているように、クラスの型パラメーターを提供するか、次のようにブリッジ(オーバーロード)メソッドを提供できます。

//overloading
public void insert(SpecificBean object){
  insert((AbstractEntryBean) object);
}
2
Edwin Dalorzo
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
    public void insert(SpecificEntryBean entry) {
        // stuff
    }
}
1
synopia