使用此代码,编译器告诉我我有不兼容的类型("需要Set< 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 {
}
我没有得到它,如果Weapon是Item的子接口,我想我应该可以用它代替Items。
我可以通过编写
解决问题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();
}
你能解释一下为什么不允许这样做?
答案 0 :(得分:0)
并非每个Item
都是Weapon
,这就是为什么您无法将其作为Set<Item>
返回的原因。使用Set<? extends Item>
即表示该集合由Item
组成,但不仅仅是Weapon
。
答案 1 :(得分:0)
嗯,这很简单。
您的方法期望为RelativeSource
<Style TargetType="ListViewItem" x:Name="MenuItemStyle">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="DarkSeaGreen" />
<Setter Property="Template" Value="{Binding SelectedTemplate, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</Trigger>
</Style.Triggers>
</Style>
但是你要回归Set<Item>
。
当期望作为基类对象List时,您不能返回子类对象的列表。
但是,当它期望作为子类对象列表时,您可以返回基类对象的列表。 (共同变回)