使用List参数

时间:2016-10-17 22:54:37

标签: 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 setThings(List<String> things) {
        this.things = things;
    }
}

这不起作用。我得到Method does not override method from its superclassboth methods have the same erasure, but neither overrides the other。我理解后者与擦除有关的错误,但即便如此,我也无法找到正确的方法来做到这一点。我尝试过其他一些像:

public abstract <T> void setThings(List<T> things);

......以及其他一些人。而且我已经找到了其他问题/答案,这些问题/答案接近于解决这个问题,但没有一个提供了可靠的答案(至少对我来说并不清楚)。我通过the tutorials阅读也无济于事。我错过了什么?

2 个答案:

答案 0 :(得分:4)

所以Java非常正确地告诉你,你还没有实现抽象方法setThings,它采用List<?>而不是List<T>List<String>。所有这些都是不同的东西。请参阅this question for a detailed explanation

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

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;
    }
}

答案 1 :(得分:2)

List<?> things是未知类型的列表。

List<T> thingsT类型的列表。

这两件事情不一样,这就是你得到编译错误的原因。

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

  • 对两个类进行一致化

    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;
        }
    }
    
  • Bar接受未知类型的列表

    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;
        }
    }