在扩展Java类时,为什么要使用泛型类型说明符?

时间:2011-07-15 17:08:03

标签: java generics

我只是想知道以下代码的用法:

public class Sub extends java.util.ArrayList<String> {...}

对通用约束java.util.ArrayList<String>没有任何编译限制。

4 个答案:

答案 0 :(得分:3)

在这种情况下,编译器会根据类型参数对其他代码进行限制。

这将编译

public class Sub extends java.util.ArrayList<String> {
  void addTwice(String s) { this.add(s); this.add(s); }
}

但这不会

public class Sub extends java.util.ArrayList<String> {
  void addTwice(Object x) { this.add(x); this.add(x); }
}

答案 1 :(得分:1)

假设您正在制作一本书的索引,但您不知道需要多少索引。您可以创建课程BookIndex extends ArrayList<String>,或者如果您想变得挑剔:BookIndex extends ArrayList<IndexEntry>

/ E1 此外,当一个类扩展类似ArrayList<String>的通用类时,可以从通用声明中获取String,这与您拥有类ArrayList<T>不同。在ArrayList<T>中,您永远无法弄清楚T是什么。

答案 2 :(得分:1)

您可以扩展课程ArrayList,但这不是您通常应该做的事情 只有在你可以说实话“extends”时才会说“this class IS-A that class.

请记住,扩展标准类不是一个好的做法

为什么不这样使用?

public class Sub {
    List<String> s = new ArrayList<String>();
    // .. 
    // ...
}

答案 3 :(得分:0)

如果您这样做,您可以添加ArrayList的基本功能,甚至可以更改其正常功能。

例如,您可以覆盖add()方法,以便它只会将电子邮件添加到列表中。