2012-03-27 170 views
17

我有以下接口:泛型:從實現的接口的抽象類繼承

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 { 
} 

我有以下錯誤:

The type SpecificEntry must implement the inherited abstract method SingleRecordInterface.insert(AbstractEntryBean)

我不明白,因爲SpecificEntryBean擴展AbstractEntryBean此錯誤的原因。我如何解決這個錯誤?

回答

29

你需要讓你的抽象類通用以及:

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

然後爲你的具體類:

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> { 
} 
+1

這是計算器我最喜歡的答案 – sector11 2017-02-15 11:05:06

3

更改爲以下:

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

public class SpecificEntry extends AbstractEntry<SpecificEntryBean> { 
    public void insert(SpecificEntryBean entry) { 
     // stuff 
    } 
} 
1
public abstract class AbstractEntry<T extends AbstractEntryBean> implements SingleRecordInterface<T> { 
} 

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

的問題是在你的

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); 
}