Java 用List参数实现泛型方法

Java 用List参数实现泛型方法,java,generics,Java,Generics,我试图定义并实现一个抽象setter,它将对象列表作为参数。以下是这个简单想法的要点: public abstract class MyClass { public abstract void setThings(List<?> things); } public class Bar extends MyClass { private List<String> things; @Override public void setThing

我试图定义并实现一个抽象setter,它将对象列表作为参数。以下是这个简单想法的要点:

public abstract class MyClass {
    public abstract void setThings(List<?> things);
}

public class Bar extends MyClass {
    private List<String> things;

    @Override
    public void setThings(List<String> things) {
        this.things = things;
    }
}
…以及其他一些人。我还发现了其他一些问题/答案,这些问题/答案接近于解决这个问题,但没有一个提供了可靠的答案(至少我不清楚)。我也通读了一遍,但没有用。我遗漏了什么?

列出事物
是一个未知类型的列表

List things
是类型为
T
的列表

这两件事不一样,这就是为什么会出现编译错误

有两种明智的方法可以消除错误:

  • 泛化两个类

    abstract class MyClass<T> {
        public abstract void setThings(List<T> things);
    }
    
    class Bar<T> extends MyClass<T> {
        private List<T> things;
    
        @Override
        public void setThings(List<T> things) {
            this.things = things;
        }
    }
    

因此,Java非常正确地告诉您,您尚未实现抽象方法
setThings
,该方法采用
列表
而不是
列表
列表
。所有这些都是不同的事情。看

最简单的解决方案是为抽象类引入泛型:

public abstract class MyClass<T> {
    public abstract void setThings(List<T> things);
}

public class SubClass extends MyClass<String> {
    private List<String> things;

    public void setThings(List<String> things) {
        this.things = things;
    }
}
公共抽象类MyClass{
公共抽象事物(列出事物);
}
公共类子类扩展了MyClass{
私人物品清单;
公共物品(列出物品){
这个东西=东西;
}
}

Oops,我刚刚忘记了示例中的
abstract
类修饰符,但我在实际代码中确实有这个修饰符。我更新了问题以反映这一点。但是我需要在我的子类中有一个具体的类型。谢谢,我使用了你的示例,它工作得很好。我将不得不花更多的时间研究泛型,一些微妙之处对我来说仍然有点神秘,例如使用
T
,'E'等之间的区别。再多读一点也无法弥补!
abstract class MyClass {
    public abstract void setThings(List<?> things);
}

class Bar extends MyClass {
    private List<?> things;

    @Override
    public void setThings(List<?> things) {
        this.things = things;
    }
}
public abstract class MyClass<T> {
    public abstract void setThings(List<T> things);
}

public class SubClass extends MyClass<String> {
    private List<String> things;

    public void setThings(List<String> things) {
        this.things = things;
    }
}