当前位置:  开发笔记 > 编程语言 > 正文

Java泛型 - 从方法返回声明类型的子类型

如何解决《Java泛型-从方法返回声明类型的子类型》经验,为你挑选了2个好方法。

我的类正在实现一个返回的超类方法List.返回的列表是只读的:

public abstract class SuperClass {
    public abstract List getComponents();
}

在我的课堂上,我想返回一个声明为List的字段 - 即一个子列表:

public class SubClass extends SuperClass {
    private List buttons;
    public List getComponents() {
        return buttons;
    }
}

这会生成编译器错误,因为List它不是子类型List.

我可以理解它为什么不编译,因为不应该允许将JTextField添加到JButton列表中.

但是,由于列表是只读的,因此应该允许"概念上".但是,当然,编译器不知道它是只读的.

有没有办法实现我想要实现的目标,而无需更改超类中的方法声明,以及子类中的字段声明?

谢谢,卡鲁姆



1> Adam Rosenfi..:

声明getComponents()为:

public List getComponents()


"相反,调用者还必须将其列表声明为List <?extends JComponent>,依此类推.Yukky." 但是呼叫者无论如何都是这样做的好习惯.由于调用者没有向列表中添加任何元素(OP表示它是只读的),调用者不应该关心列表的实际参数,只要它扩展JComponent即可.对于抽象,调用者应该使用他/她需要的限制最少的类型.

2> 小智..:

我想我找到了我正在寻找的答案......

return Collections.unmodifiableList(buttons);

我曾经尝试过:

return Collections.unmodifiableList(buttons);

但这是类型推断的List.

放入显式类型参数允许将List其视为a List,这是允许的unmodifiableList().

我现在很开心;-)而且我已经通过讨论学到了一些东西.

Calum

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有