繁体   English   中英

使用List参数实现通用方法

[英]Implement generic method with List parameter

我正在尝试定义然后实现一个将对象列表作为参数的抽象设置器。 这是这个简单想法的要点:

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 superclass并且both methods have the same erasure, but neither overrides the other 我了解与擦除相关的后一个错误,但即使如此,我也无法找出正确的方法来执行此操作。 我已经尝试了其他一些类似的方法:

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

...以及其他一些 而且我发现了关于SO的其他问题/答案,可以解决这个问题,但没有一个提供可靠的答案(至少对我来说不是很清楚)。 我也通读了这些教程 ,但都无济于事。 我想念什么?

因此,Java完全正确地告诉您尚未实现抽象方法setThings ,该方法采用List<?>而不是List<T>List<String> 所有这些都是不同的东西。 有关详细说明,请参见此问题

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

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

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

List<T> 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; } } 
  • 使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; } } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM