2017-03-23 156 views
2

我有一個實體類的層次結構,並希望在Java中爲它們創建服務接口的層次結構。那麼UI組件應通過接口來訪問實體相關的服務:Java通用接口層次結構

class BaseEntity { } 
class Fruit extends BaseEntity { } 
class Banana extends Fruit { } 
class Apple extends Fruit { } 

(這是在稍有不同的上下文中重用在多個地方)的UI組件需要通過接口FruitService訪問果品服務,我要決定在運行期間,這將是BananaService或AppleService服務接口。我想這將是簡單的使用泛型:

interface Service<T extends BaseEntity> 
{ 
    List<T> getAll(); 
    void save (T object); 
    void delete (T object); 
} 

// More strict interface only allowed for fruits. Referenced by UI component 
interface FruitService<F extends Fruit> extends Service<Fruit> {} 

// Interface only allowed for bananas 
interface BananaService extends FruitService<Banana> {} 

class BananaServiceImpl implements BananaService 
{ 
    // Compiler error here because expecting Fruit type: 
    @Override 
    public List<Banana> getAll() 
    { 
    } 
    ... 
} 

但是,這是給我下面的編譯器錯誤:

The return type is incompatible with Service<Fruit>.getAll() 

爲什麼Java的不承認,執行已參數化香蕉?我希望BananaServiceImpl中的泛型參數能夠像香蕉服務中指定的那樣被解析爲香蕉!

回答

8
interface FruitService<F extends Fruit> extends Service<Fruit> {} 

應該

interface FruitService<F extends Fruit> extends Service<F> {} 

這樣一來,你在通用穿越到服務

+0

美麗,這個固定的編譯錯誤。謝謝! – Wombat