2017-08-21 21 views
1

使用此代碼,編譯器告訴我我具有不兼容的類型(「需要設置< Item>但具有Set < Weapon>」)。聲明子類時不兼容的類型

import java.util.Set; 

class clazz extends AbstractClass{ 
    private Set<Weapon> items; 

    @Override 
    Set<Item> getItems() { 
     return items; //Incompatible Types here 
    } 
} 

abstract class AbstractClass { 
    abstract Set<Item> getItems(); 
} 

interface Item { 
} 

interface Weapon extends Item { 
} 

我不明白這一點,如果武器是項目的子接口,我想我應該能夠在地方項目中使用它。

我可以通過寫

import java.util.Set; 

class clazz extends AbstractClass{ 
    private Set<Weapon> items; 

    @Override 
    Set<? extends Item> getItems() { 
     return items; 
    } 
} 

abstract class AbstractClass { 
    abstract Set<? extends Item> getItems(); 
} 

這是爲什麼不允許你能向我解釋,解決這一問題?

+1

這傢伙的答案可能會解決你的問題。他有很好的解釋 https://stackoverflow.com/a/6319181/7450269 – RootOnChair

回答

0

並非每個ItemWeapon這就是爲什麼你不能將它作爲Set<Item>返回。通過使用Set<? extends Item>您聲明Set包含Item's,但不僅包含Weapon's。

0

嗯,很簡單。

你的方法需要爲Set<Item>

Set<Item> getItems() { 
    return items; //Incompatible Types here 
} 

但是,你正在返回Set<Weapon>

當期望作爲基類對象List時,您不能返回子類對象的列表。

但是,當期望作爲子類對象列表時,您可以返回基類對象的列表。 (Co-variant return)