(黑马程序员)泛型限定原理和使用(一)

泛型通配符是,可以接受任一定义的引用参数类型,但是我们如果并不想使我么定义的方法接受所有的引用数据类型,

而是接受某一部分类型怎么办呢,此时我们就可以对泛型的进行限定,使我们定义的函数或类更加安全。


例如我们定义如下两个集合,a1a2(此处我们设定studentperson的子类)

       public static void main(String[] args) {

 ArrayList<Person> a1 = new ArrayList<Person>();
 
 a1.add(new Person("person1",3));
 a1.add(new Person("person2",4));
 
 ArrayList<Student> a2 = new ArrayList<Student>();
 
 a2.add(new Student("stu1",1));
 a2.add(new Student("stu2",2));
 }

如果我们要定义一个方法(且不论这个方法是做什么的),既能接收a1又能接受a2,那么首先我们就会想到泛型通配符

那就就应该这么定义

public static void printCollection(Collection<?> al) {}    //此方法主函数调用时即可接受a1又可a2,


但是有时我们定义的方法要实现的功能又可能是在某一个特定的对象内的功能,例如我们定义的方法要用上面集合

person类内的特有方法getName()方法,那么此时我们就必须对这个函数接受的内容加以限定,否则就会变的

不再安全,因为这个public static void printCollection(Collection<?> al) {} 函数是什么类型内容的集合都可以接收,

如下面一个集合a3存的是字符串,它一样可以接收,但显然字符串里没有getName()方法,我们的程序会出错。

ArrayList<String> a3 = new ArrayList<String>();
 a3.add("aaaa");
 a3.add("bbbb");

这里我们对函数泛型类型加以限定就派上了用场,限定只接受person类或是其子类的对象集合,因为它们才有getName()

方法,才是我们要操作的对象,可以这么限定

public static void printCollection(Collection<? extends Person>   c){  }

此处的<? extends Person>即泛型的上限,只可接受personperson的子类,再往里传a3的值已经不行,编译就通不过。

还有<? super E>即泛型的下限,只可接受E或者E的父类,也是对函数的接受类型加以的限定,这就是泛型限定的来源,

以及为什么用泛型的限定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值