首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

有关集合框架泛型的有关问题

2013-06-25 
有关集合框架泛型的问题本帖最后由 qq771349657 于 2013-05-13 13:38:02 编辑import java.util.*import j

有关集合框架泛型的问题
本帖最后由 qq771349657 于 2013-05-13 13:38:02 编辑


import java.util.*;
import java.util.Comparator;

public class Noname1 {

/**
 * @param args
 */
public static void main(String[] args) {
////元素为People的ArrayList集合
ArrayList<Person> al = new ArrayList<Person>();
al.add(new Person("abc1"));
al.add(new Person("abc2"));
al.add(new Person("abc3"));
Iterator<Person> it = al.iterator();

while(it.hasNext())
{
System.out.println(it.next().getName());
}

ArrayList<Student> al1 = new ArrayList<Student>();//元素为Student的ArrayList集合
al1.add(new Student("abc--1"));
al1.add(new Student("abc--2"));
al1.add(new Student("abc--3"));

Iterator<Student> it1 = al1.iterator();
while(it1.hasNext())
{
System.out.println(it1.next().getName());
}

System.out.println(al.addAll(al1));//true

Iterator<Person> it2= al.iterator();
while(it2.hasNext())
{
System.out.println(it2.next().getName());
/*打印abc1
      abc2
      abc3
      abc--1
      abc--2
      abc--3
                         */
}
System.out.println("-----");
al.add(new Student("abc--4"));

it2= al.iterator();
while(it2.hasNext())
{
System.out.println(it2.next().getName());
/*打印abc1
              abc2
      abc3
      abc--1
      abc--2
      abc--3
      abc--4*/
}

}

}
class Person{
private String name;
Person(String name){
this.name=name;
}
public String getName(){
return name;
}
}
class Student extends Person{
Student(String name){
super(name);
}
}
class Comp implements Comparator<Person>{
public int compare(Person s1,Person s2){
return s1.getName().compareTo(s2.getName());
}
}

有两个问题想不太明白 
第一个ArrayList已经指定类型为People
1.48行add方法可以add子类类型
2.addAll方法可以添加第二个ArrayList集合中所有Student元素
泛型中应该没有多态这一说吧 泛型 IT
[解决办法]
Student是Person,所以add当然可以,父类引用可以指向子类实例
addAll和add方法无本质区别

但是你要是按照下面的写法就无法 add了
ArrayList<? extends Person> al = new ArrayList<Student>();
al.add(new Student("abc"));


al.add(new Person("abc"));
因为编译器不知道你add的是具体父类还是子类


[解决办法]
元素支持多态嘛,本质上 上述泛型的add方法就是想 是想实现如下代码


 



/**
 * 使用泛型为了解决类型匹配的问题
 * 必须是People 类型才能添加到List中,否则直接编译不通过
 */
class MyList extends ArrayList<People>
{
@override
public boolean add(People  p)
{
return add(p);
}
}



那么将Student 作为参数调用add(People P) 方法是否成功呢?

根据多态原理,当然成功了。

故,ArrayList<People> 可以添加 People 类的子类的对象

[解决办法]
这个显然是多态的原理,你Student继承了Person,其实泛型有这种写法,


上限(上边界):

ArrayList<? extends Number> al = new ArrayList<Integer>();  正确

这句话的意思是说,是Number的子类,包含Number自己, 也就是说,你再不济也得是Number
最多你也就到Number了,和Number的儿子们。

ArrayList<? extends Number> al = new ArrayList<String>();  错误
原因:Number的儿子们中包括Number自己,都没有你String这吗个东西。


下限(下边界):

ArrayList<? super Integer> al = new ArrayList<Number>();  正确
这句话是说,是Integer的父类,包含Integer自己,也就是说,最低也得是Integer,
或者是他的 爸爸,爷爷们。

ArrayList<? super Integer> al = new ArrayList<Byte>();      错误
原因:Byte既不是Integer的爸爸,也不是Integer的爷爷,更不是Integer自己,他是Inetger的兄弟,
所以错误。


Lz要理解多态 男人继承人 你给List规定里面必须是人  那么 男人自然也可以装到集合里
[解决办法]
引用:
 
那addAll(Collection<? extends E> c)方法中写<? extends E>和写<E>岂不是没有分别了 ,如果<E>可以传入E和E的子类类型


http://mysun.iteye.com/blog/851925

热点排行