有关集合框架泛型的问题

可爱多啦咪 2013-05-13 01:33:34

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元素
泛型中应该没有多态这一说吧
...全文
224 9 打赏 收藏 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
anshiny 2013-05-20
  • 打赏
  • 举报
回复
引用 7 楼 qq771349657 的回复:
这样吧API中的addAll(Collection<? extends E> c)方法定义的时候,定义成addAll(Collection<E> c) 两个效果是一样的麽,
不一样。 因为Collection<Integer> 并不是Collection<Object> 的子类。
anshiny 2013-05-20
  • 打赏
  • 举报
回复
子类的对象也可看父类的对象。这是多态。
lk198186 2013-05-14
  • 打赏
  • 举报
回复
引用 4 楼 qq771349657 的回复:
那addAll(Collection<? extends E> c)方法中写<? extends E>和写<E>岂不是没有分别了 ,如果<E>可以传入E和E的子类类型
http://mysun.iteye.com/blog/851925
Candylibin 2013-05-14
  • 打赏
  • 举报
回复
这个显然是多态的原理,你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规定里面必须是人 那么 男人自然也可以装到集合里
可爱多啦咪 2013-05-14
  • 打赏
  • 举报
回复
引用 5 楼 Candylibin 的回复:
这个显然是多态的原理,你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规定里面必须是人 那么 男人自然也可以装到集合里
这样吧API中的addAll(Collection<? extends E> c)方法定义的时候,定义成addAll(Collection<E> c) 两个效果是一样的麽,
可爱多啦咪 2013-05-13
  • 打赏
  • 举报
回复
那addAll(Collection<? extends E> c)方法中写<? extends E>和写<E>岂不是没有分别了 ,如果<E>可以传入E和E的子类类型
n27741 2013-05-13
  • 打赏
  • 举报
回复
元素支持多态嘛,本质上 上述泛型的add方法就是想 是想实现如下代码


/**
 * 使用泛型为了解决类型匹配的问题
 * 必须是People 类型才能添加到List中,否则直接编译不通过
 */
class MyList extends ArrayList<People>
{
	@override
	public boolean add(People  p)
	{
		return add(p);		
	}
}
那么将Student 作为参数调用add(People P) 方法是否成功呢? 根据多态原理,当然成功了。 故,ArrayList<People> 可以添加 People 类的子类的对象
lk198186 2013-05-13
  • 打赏
  • 举报
回复
Student是Person,所以add当然可以,父类引用可以指向子类实例 addAll和add方法无本质区别 但是你要是按照下面的写法就无法 add了 ArrayList<? extends Person> al = new ArrayList<Student>(); al.add(new Student("abc")); al.add(new Person("abc")); 因为编译器不知道你add的是具体父类还是子类
yongger520 2013-05-13
  • 打赏
  • 举报
回复
子类对象也是父类对象, Student也是People,当然可以添加进去啦

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧