Java 定义没有特定类型的集合
(i) -定义集合而不指定类型意味着什么?用于什么目的 它是为你做的吗 (ii)-我可以通过任何方式向集合添加不同的类型吗 这里有一个例子-没有编译错误,尽管它警告我 但是,除此之外,还有一个运行时错误Java 定义没有特定类型的集合,java,collections,Java,Collections,(i) -定义集合而不指定类型意味着什么?用于什么目的 它是为你做的吗 (ii)-我可以通过任何方式向集合添加不同的类型吗 这里有一个例子-没有编译错误,尽管它警告我 但是,除此之外,还有一个运行时错误 在不指定类型参数的情况下定义集合(或任何类型化类)将使用原始类型调用。它的存在仅是为了向后兼容,不应在新代码中使用。If有效地移除泛型对类型的所有影响 通常,您可以将集合定义为接受对象:然后它将接受所有值:set vals=new HashSet()。但是,这对TreeSet不起作用,因为它需要
对象
:然后它将接受所有值:set vals=new HashSet()
。但是,这对TreeSet
不起作用,因为它需要其值相互关联。如果您想将任意类型添加到相同的树集
(这通常是某些架构问题的迹象,即设计气味),那么您需要实现自己的,可以比较任意元素并将其传递到对象
:然后它将接受所有值:set vals=new HashSet()
。但是,这对TreeSet
不起作用,因为它需要其值相互关联。如果您想将任意类型添加到相同的树集
(这通常是某些架构问题的迹象,即设计气味),那么您需要实现自己的,可以比较任意元素并将其传递到在编译时获取错误通常比获取运行时错误要好。(更容易找到和修复)直到Java 1.4,都没有泛型。所有集合只能包含
对象
,并且在将对象从集合中取出后使用该对象时,必须对其进行分类强制转换。你会这么做吗
public static void main(String[] args) {
Set vals = new TreeSet();
vals.add("one");
vals.add(1);
vals.add("two");
System.out.println(vals);
}
而不是
Set vals = new Treeset();
String s = (String)vals.get(0);
Set vals=new Treeset();
字符串s=vals.get(0);
放置没有共享接口或超类的不同类型的对象是非常糟糕的做法,因为当您将对象从集合中取出时,您不知道如何处理该对象。直到Java 1.4,没有泛型。所有集合只能包含
对象
,并且在将对象从集合中取出后使用该对象时,必须对其进行分类强制转换。你会这么做吗
public static void main(String[] args) {
Set vals = new TreeSet();
vals.add("one");
vals.add(1);
vals.add("two");
System.out.println(vals);
}
Set<String> vals = new Treeset<String>();
String s = vals.get(0);
而不是
Set vals = new Treeset();
String s = (String)vals.get(0);
Set vals=new Treeset();
字符串s=vals.get(0);
放置没有共享接口或超类的不同类型的对象是非常糟糕的做法,因为从集合中取出对象时,您不知道如何处理它。private Set s1;
Set<String> vals = new Treeset<String>();
String s = vals.get(0);
公开募捐{
阿莫德(s1);
}
/*第7行*/公共空心板(成套面板){
}
如果您通过将第7行更改为
private Set<JPanel> s1;
public void run() {
aMethod(s1);
}
/* line 7 */ public void aMethod(Set panels) {
}
public void-aMethod(设置面板){
它将不再编译。如果您将该行重构为
public void aMethod(Set<Object> panels) {
public void-aMethod(设置面板){
它仍将像以前一样编译,并且作为额外的奖励,您将不再拥有“Set is raw…”警告private Set s1;
公开募捐{
阿莫德(s1);
}
/*第7行*/公共空心板(成套面板){
}
如果您通过将第7行更改为
private Set<JPanel> s1;
public void run() {
aMethod(s1);
}
/* line 7 */ public void aMethod(Set panels) {
}
public void-aMethod(设置面板){
它将不再编译。如果您将该行重构为
public void aMethod(Set<Object> panels) {
public void-aMethod(设置面板){
它仍将像以前一样编译,作为额外的奖励,您将不再有“Set is raw…”警告如果你先添加一个
整数,然后再尝试添加一个字符串,它会被一个ClassCastException炸掉。@Sahil Muthoo:oops,我实际上没有想到TreeSet
特别是,你是对的。我现在已经澄清了。设置一个可以初始化的集合,无论它的类型与S不同设置一个只能初始化为通用类型的集合_Object@Andrei:我不明白。你是在说Set
和Set
的区别吗?如果是的话,那么我认为这与问题无关。Set vals=new TreeSet()
如果你先添加一个整数,然后再尝试添加一个字符串,它会被一个ClassCastException炸掉。@Sahil Muthoo:oops,我实际上没有想到TreeSet
特别是,你是对的。我现在已经澄清了。设置一个可以初始化的集合,无论它的类型与S不同设置一个只能初始化为通用类型的集合_Object@Andrei:我不明白。你是在说Set
和Set
的区别吗?如果是的话,那么我认为这与问题无关。很好!你永远不应该低估代码重构准备的重要性。很好!你不应该r低估了代码重构准备的重要性。