【问题标题】:How to make an ungeneric class extending from a generic super class如何制作从泛型超类扩展的非泛型类
【发布时间】:2019-05-24 22:48:55
【问题描述】:

我愿意将字符串添加到只允许包含字符串的列表中。调用add(String s)后,我想修改字符串(例如:添加日期),然后将修改后的字符串存储到列表中。但是,不能添加其他数据类型。

我的第一个想法是从一个简单的 ArrayList 扩展而来。不幸的是,我最终不得不修改大约 7-12 个函数。

你的建议是什么?

谢谢

【问题讨论】:

  • class B extends ArrayList<String>。你几乎肯定不实际上想要这个。
  • 我建议你实现一个接口:class B implements List<String>.
  • 我想要这个。因为我必须重写 add-method,所以我想将最近的 Date 添加到每个 String 的位置需要添加为 String...所有其他方法都应该像 ArrayList 一样工作...您会建议什么?
  • 您宁愿实现List<String> 并使用ArrayList<String> 作为成员变量,适配器模式。扩展 ArrayList<String> 听起来很吓人。
  • 如果您打算更改每个添加的元素,您需要覆盖的不仅仅是 add 方法。您还需要覆盖 addAll、set、replaceAll、subList 和 listIterator。更好的选择是创建您自己的类,该类不扩展任何内容(除了 java.lang.Object),保留私有 List,并提供一些公共方法来读取和修改它。提供 List 的防御性副本的公共方法可能是个好主意。

标签: java generics arraylist


【解决方案1】:

您需要在扩展数组列表时指定它提供String 作为泛型类型,并且不要向您的新类添加泛型类型。

public class StringList extends ArrayList<String> {...}

【讨论】:

  • @tvsuchty 看看这个对一个好问题的解释:stackoverflow.com/help/how-to-ask。我想说导致否决票的两件事是,它最初没有说明您为什么要尝试解决遗传学问题,其次,没有任何迹象表明您尝试过什么以及您遇到的问题” d 在尝试解决时遇到的问题。即便如此,对于第一次发帖,我个人会说投反对票而不是评论是很容易处理的!
  • 谢谢!下次我会做得更好。
【解决方案2】:

我得到的建议最好的选择是编写一个不扩展任何内容的类,只扩展 java.lang.Object,然后添加一个私有 ArrayList。

public class StringList {
   private ArrayList<String> list;
}

然后您可以通过添加函数或其他任何方法轻松扩展此方法。

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多