java 泛型 t extends_Java泛型的定义以及对于<? extends T>和<? super T>

Java 中对于泛型方法的定义:

public T getT(){

.....相关代码;

}

其中我对的理解就是申明只是一个泛型方法的标记,T是返回的类型。

对于泛型类的定义:

public class Type{

....相关代码

}

上面写的是关于泛型方法和泛型类的定义。这里写这篇博客的主要目的是为了记录 extends T> 和 super T>的理解。

extends T>是上界通配符。逻辑上来说,一个可以往里面放动物的容器,也可以往里面放狗,因为狗是继承了动物的,所以从

逻辑上来说,一个可以放狗的容器也应该是继承一个可以放动物的容器的。但是Java中这是不对的。这时候就需要上界通配符来解决这个问题。

可以定义一个Content extends Animal> content,这个content容器里面可以放任何Animal包括其子类。这使得容器Content之间也有

了一定的联系。但是其中的也有一定的副作用。Content类里面有个getContent()方法,这个方法是不会影响使用的。因为对java编译器来说,

里面所有的东西都有一个相同的父亲,那就是Animal。但是如果你想要使用setContent()方法,这时就会出现一个问题,问题是什么呢?那就

是我只知道里面的类型是Animal以及Animal的派生类,但是无法确定具体的类型,是Dog或者Cat等。这里的类型没有具体给明,所以编译器

在这里只是给了一个占位符,所以到后面往t里面放Dog或者Apple的时候他都不知道是不是和Animal相匹配,所以这是不允许使用set的。下面

方法中的 public void setContent(List content) 如果想可以set T包括T的子类的List的时候,可以这么定义:

public void setContent(List content)。

super T>是下界通配符。其作用这好和上面的 extends T>相反。Content super Animal> content 表示的是Animal 以及Animal

基类的容器,但不是Dog基类的容器。里面的setContent()方法是可以正常使用的。因为它规定了最小粒度的下限,那就是Animal。但是它往外面

getContent()就比较费劲,因为他们公共的基类只有Object。所以取出来的内容只能用Object来装。

所以这里总结了一点就是如果一个内容他需要set的内容比较多,那就使用 super T>。如若使用get的多一点,那就使用 extends T>。

下面是自己定义的一个Content类:

1 packagetest;2

3 importjava.util.ArrayList;4 importjava.util.Collections;5 importjava.util.List;6

7 public class Content{8 privateString contentName;9 private Listcontent;10 privateT t;11 private intsize;12 publicContent(){13 content = new ArrayList();14 size = 0;15 }16 publicString getContentName() {17 returncontentName;18 }19 public voidsetContentName(String contentName) {20 this.contentName =contentName;21 }22 public ListgetContent() {23 returncontent;24 }25 @SuppressWarnings("unchecked")26 public void setContent(List extends T>content) {27 this.content = (List) content;28 }29 public voidadd(T content){30 this.content.add(content);31 }32 public voidgetInfo(){33 System.out.println(content.toString());34 }35 public intgetSize(){36 size =content.size();37 returnsize;38 }39 publicT getT() {40 returnt;41 }42 public voidsetT(T t) {43 this.t =t;44 }45 public void remove(intpos){46 this.content.remove(pos);47 }48 public T get(inti){49 if(i>content.size())50 return null;51 returncontent.get(i);52 }53 }

定义的Animal类:

1 packagetest;2

3 public classAnimal {4 privateString type;5 privateString describe;6 publicAnimal(){7

8 }9 publicAnimal(String type,String describe){10 this.type =type;11 this.describe =describe;12 }13 publicString getType() {14 returntype;15 }16 public voidsetType(String type) {17 this.type =type;18 }19 publicString getDescribe() {20 returndescribe;21 }22 public voidsetDescribe(String describe) {23 this.describe =describe;24 }25

26 }

继承Animal的Dog类

1 packagetest;2

3 public class Dog extendsAnimal {4 privateString name;5 private intage;6 public Dog(String type,String describe,String name,intage){7 super(type,describe);8 this.name =name;9 this.age =age;10 }11 publicString getName() {12 returnname;13 }14 public voidsetName(String name) {15 this.name =name;16 }17 public intgetAge() {18 returnage;19 }20 public void setAge(intage) {21 this.age =age;22 }23

24 }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值