Java 声明子类时不兼容的类型

Java 声明子类时不兼容的类型,java,oop,inheritance,abstract-class,Java,Oop,Inheritance,Abstract Class,有了这段代码,编译器告诉我我有不兼容的类型(“required Set但have Set”) import java.util.Set; 类clazz扩展了抽象类{ 私人设置项目; @凌驾 设置getItems(){ return items;//此处的类型不兼容 } } 抽象类抽象类{ 抽象集合getItems(); } 接口项{ } 接口武器扩展项{ } 我不明白,如果武器是物品的子界面,我想我应该可以用它来代替物品 我可以通过写作来解决这个问题 import java.util.Set;

有了这段代码,编译器告诉我我有不兼容的类型(“required Set但have Set”)

import java.util.Set;
类clazz扩展了抽象类{
私人设置项目;
@凌驾
设置getItems(){
return items;//此处的类型不兼容
}
}
抽象类抽象类{
抽象集合getItems();
}
接口项{
}
接口武器扩展项{
}
我不明白,如果武器是物品的子界面,我想我应该可以用它来代替物品

我可以通过写作来解决这个问题

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();
}
import java.util.Set;
类clazz扩展了抽象类{
私人设置项目;
@凌驾

设置不是每个
项目都是
武器
这就是为什么不能将其作为
设置
返回。使用
设置不是每个
项目都是
武器
这就是为什么不能将其作为
设置
返回。使用
设置很简单

您的方法应为
Set

Set getItems(){
return items;//此处的类型不兼容
}
但是您正在返回
Set

当需要作为基类对象列表时,不能返回子类对象列表

然而,当基类对象列表预期为子类对象列表时,您可以返回该列表。(共变量返回)很简单

您的方法应为
Set

Set getItems(){
return items;//此处的类型不兼容
}
但是您正在返回
Set

当需要作为基类对象列表时,不能返回子类对象列表


但是,当基类对象列表作为子类对象列表时,您可以返回它。(Co variant return)

这个家伙的答案可能会解决您的问题。他有很好的解释这个家伙的答案可能会解决您的问题。他有很好的解释
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();
}
Set<Item> getItems() {
    return items; //Incompatible Types here
}