首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用列表参数实现泛型方法

用列表参数实现泛型方法
EN

Stack Overflow用户
提问于 2016-10-17 22:54:37
回答 2查看 2.7K关注 0票数 2

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

代码语言:javascript
运行
复制
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。我理解与擦除有关的后一个错误,但即便如此,我还是找不出正确的方法来做到这一点。我尝试过其他的方法,比如:

代码语言:javascript
运行
复制
public abstract <T> void setThings(List<T> things);

...as和其他几个人一样。我还找到了其他问题/答案,以便接近解决这一问题,但没有一个问题/答案提供了坚实的答案(至少对我来说不是很清楚)。我也读过教程,但没有用。我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-17 23:07:57

因此,Java非常正确地告诉您,您还没有实现抽象方法setThings,它使用的是List<?>,而不是List<T>List<String>。所有这些都是不同的东西。见这个问题需要详细解释

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

代码语言:javascript
运行
复制
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;
    }
}
票数 4
EN

Stack Overflow用户

发布于 2016-10-17 22:58:21

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

List<T> thingsT类型的列表。

这两件事是不一样的,这就是为什么你要得到编译错误。

要消除这一错误,有几种明智的方法:

  • 两类的泛化 抽象类MyClass {公共抽象空虚setThings(列表事物);}类栏扩展MyClass {私有列表事物;@重写公共空setThings(列表事物){ this.things = things;}
  • 使Bar也接受未知类型的列表 抽象类MyClass {公共抽象空虚setThings(列表事物;@重写公共抽象setThings(List things) ){ this.things = things;}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40096908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档