为什么在扩展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
。为什么这不是一个好的做法?这不是面向对象语言的用途吗?我认为这真的取决于你想/需要做什么。为什么这不是一个好的做法?这不是面向对象语言的用途吗?我认为这取决于你想/需要做什么。