黑马程序员技术交流社区

标题: 关于泛型限定的问题(已解决) [打印本页]

作者: 韩新凯    时间: 2012-5-6 23:09
标题: 关于泛型限定的问题(已解决)
本帖最后由 韩新凯 于 2012-5-8 20:46 编辑

Student extends Person
<? extends E> : 可以接收E类型或者E的子类型。上限。
如果这里填入Student的话可不可以传入Person,为什么?
如果填入的是Person可不可以传入Student,为什么?

<? super E> : 可以接收E类型或者E的父类型。下限。
如果这里填入Student的话可不可以传入Person,为什么?
如果填入的是Person可不可以传入Student,为什么?


自己搞的差不多了,如果和我有一样疑问的朋友最好自己去试试。我就是自己最后试出来的。
作者: 胡生蒙    时间: 2012-5-6 23:19
<? extends E>:如果这里填入Student的话可不可以传入Person,这里是不能传入Person的,这里要求传入的是学生,而你传入的是一个人,传入的这个人可能是一个工人,这是不行的。如果填入的是Person可不可以传入Student,这是可以的,这里要求传入的是一个人,而你传入的是一个学生,学生也是一个人,这是可以的,这里也是多态,相当于Person p = new Student().   
<? super E>这个的解释可以参照上面的解释
作者: 小鹿叙鹿    时间: 2012-5-6 23:21
可以
因为这样多的目的是为了让多个类可以用一个类中定义好的功能。
为什么呢?
因为这里应用了多态,只要你实现了父类中的方法功能,你就可以把子类作为参数传进去,但是在运行的时候是以子类为主
这实现了代码的复用,提高了代码的健壮性。
作者: 韩新凯    时间: 2012-5-8 11:55
胡生蒙 发表于 2012-5-6 23:19

class Comp implements Comparable<Person>{//<? super E>这里为什么可以传入学生?

        @Override
        public int compareTo(Person s) {
                // TODO Auto-generated method stub
                .......
                return 0;
        }
       
}
作者: 徐然    时间: 2012-5-8 13:15
class Comp implements Comparable<Person>{//<? super E>这里为什么可以传入学生?如果学生是继承了Person的话,是不能传入学生的啊
                                                                                  因为<? super E>限定的是Person及其父类啊


        @Override
        public int compareTo(Person s) {
                // TODO Auto-generated method stub
                .......
                return 0;
        }
        
}
作者: 韩新凯    时间: 2012-5-8 16:01
本帖最后由 韩新凯 于 2012-5-8 16:09 编辑
徐然 发表于 2012-5-8 13:15
class Comp implements Comparable{//


毕老师说是可以的:
package com.generic;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class GenericDemo {
public static void main(String[] args) {
  TreeSet<Student> ts = new TreeSet<Student>(new Comp());
  ts.add(new Student("abc1"));
  ts.add(new Student("abc2"));
  ts.add(new Student("abc3"));
  Iterator<Student> it = ts.iterator();
  while (it.hasNext()) {
   Student stu = it.next();
   System.out.println(stu.getName());
  }
}
}
class Person {
private String name;
public Person(String name) {
  super();
  this.name = name;
}
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
}
class Student extends Person {
public Student(String name) {
  super(name);
  // TODO Auto-generated constructor stub
}
}
class Comp implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
  // TODO Auto-generated method stub
  return o1.getName().compareTo(o2.getName());
}
}

作者: 韩新凯    时间: 2012-5-8 16:11
非常感谢楼上几位朋友的回答,但是我还是不太明白。
作者: 韩新凯    时间: 2012-5-8 20:44
自己搞的差不多了,就这样吧。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2