私は次のインターフェースを持っています:
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を拡張していることを考えると、このエラーの理由がわかりません。このエラーを修正するにはどうすればよいですか?
抽象クラスもジェネリックにする必要があります:
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}
次に、具体的なクラスについて:
public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
}
次のように変更します。
public abstract class AbstractEntry<EB extends AbstractEntryBean> implements SingleRecordInterface<EB> {
}
そして
public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
public void insert(SpecificEntryBean entry) {
// stuff
}
}
問題はあなたの宣言にあります
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);
}
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> {
}
public class SpecificEntry extends AbstractEntry<SpecificEntryBean> {
public void insert(SpecificEntryBean entry) {
// stuff
}
}