声明子类时不兼容的类型

时间:2017-08-21 12:12:15

标签: java oop inheritance abstract-class

使用此代码,编译器告诉我我有不兼容的类型("需要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();
}

你能解释一下为什么不允许这样做?

2 个答案:

答案 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时,您不能返回子类对象的列表。

但是,当它期望作为子类对象列表时,您可以返回基类对象的列表。 (共同变回)