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

为什么在扩展Java类时要使用泛型类型说明符?,java,generics,Java,Generics,我只是想知道下面的代码有什么用途: public class Sub extends java.util.ArrayList<String> {...} 公共类子扩展java.util.ArrayList{…} 通用约束java.util.ArrayList没有任何编译限制,假设您正在为一本书编制索引,但不知道需要多少索引。您可以创建一个类bookindextensedarraylist,或者如果您想变得非常挑剔:bookindextensedarraylist /e1 另外,当

我只是想知道下面的代码有什么用途:

public class Sub extends java.util.ArrayList<String> {...}
公共类子扩展java.util.ArrayList{…}

通用约束
java.util.ArrayList

没有任何编译限制,假设您正在为一本书编制索引,但不知道需要多少索引。您可以创建一个类
bookindextensedarraylist
,或者如果您想变得非常挑剔:
bookindextensedarraylist

/e1
另外,当一个单类扩展一个泛型类(如
ArrayList
时,可以从泛型声明中抓取
字符串,这与使用类
ArrayList
不同。在
ArrayList
中,您永远无法计算出
T
是什么。

假设您正在为一本书编制索引,但您不知道需要多少索引。您可以创建一个类
bookindextensedarraylist
,或者如果您想变得非常挑剔:
bookindextensedarraylist

/e1
另外,当一个单类扩展一个泛型类(如
ArrayList
时,可以从泛型声明中抓取
字符串,这与使用类
ArrayList
不同。在
ArrayList
中,您永远无法理解
T
是什么。

您可以扩展类
ArrayList
,但这不是您通常应该做的事情。
只有当你能诚实地说“
这个类是那个类时,才可以说“
扩展了”

记住,扩展标准课程不是一个好的做法

为什么不这样使用呢

public class Sub {
    List<String> s = new ArrayList<String>();
    // .. 
    // ...
}
公共类子类{
列表s=新的ArrayList();
// .. 
// ...
}

您可以扩展类
ArrayList
,但这不是您通常应该做的事情。
只有当你能诚实地说“
这个类是那个类时,才可以说“
扩展了”

记住,扩展标准课程不是一个好的做法

为什么不这样使用呢

public class Sub {
    List<String> s = new ArrayList<String>();
    // .. 
    // ...
}
公共类子类{
列表s=新的ArrayList();
// .. 
// ...
}

如果这样做,您可以添加到
阵列列表的基本功能中,甚至可以更改其正常功能


例如,您可以覆盖
add()
方法,使其仅将电子邮件添加到列表中。

如果这样做,您可以添加到
阵列列表的基本功能中,甚至更改其正常功能


例如,您可以重写
add()
方法,使其仅将电子邮件添加到列表中。

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

这将编译

public class Sub extends java.util.ArrayList<String> {
  void addTwice(String s) { this.add(s); this.add(s); }
}
public类子类扩展了java.util.ArrayList{
void addtweep(字符串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); }
}
public类子类扩展了java.util.ArrayList{
void addtweeps(Object x){this.add(x);this.add(x);}
}

在本例中,编译器会根据类型参数对其他代码进行限制

这将编译

public class Sub extends java.util.ArrayList<String> {
  void addTwice(String s) { this.add(s); this.add(s); }
}
public类子类扩展了java.util.ArrayList{
void addtweep(字符串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); }
}
public类子类扩展了java.util.ArrayList{
void addtweeps(Object x){this.add(x);this.add(x);}
}

什么意思,“对通用约束java.util.ArrayList没有任何编译限制”?什么意思,“对通用约束java.util.ArrayList没有任何编译限制”?我不认为继承是为一本书建立索引的正确方法。最好使用数组/数组列表,而不是从中扩展。这不是最好的方法,但这是一种方法;通常最好是这样。我不认为继承是为一本书编制索引的正确方法。最好使用数组/数组列表,而不是从中扩展。这不是最好的方法,但这是一种方法;一般来说最好是这样。记住,扩展标准课程不是一个好的做法。相反,您可以在类中编写它们并使用它们。检查我的answer@saugok,我没有忘记。我刚才回答了OP的问题,我假设这个问题被简化为使用标准类来使用一个简短的示例,而不是定义两个类。@saugok,另外,你的规则太宽泛了。有些标准类意味着被重写,例如,
FilterInputStream
@Smauel,我最好将演示代码从
ArrayList
修改为
ArrayList
。记住,扩展标准类不是一个好的做法。相反,您可以在类中编写它们并使用它们。检查我的answer@saugok,我没有忘记。我刚才回答了OP的问题,我假设这个问题被简化为使用标准类来使用一个简短的示例,而不是定义两个类。@saugok,另外,你的规则太宽泛了。一些标准类意味着被重写,例如,
FilterInputStream
@Smauel,我最好将我的演示代码从
ArrayList
修改为
ArrayList
。为什么这不是一个好的做法?这不是面向对象语言的用途吗?我认为这真的取决于你想/需要做什么。为什么这不是一个好的做法?这不是面向对象语言的用途吗?我认为这取决于你想/需要做什么。