java wildcard_java泛型 wildcard

import java.util.ArrayList;

import java.util.List;

public class WildCard {

public static void main(String[] args) {

Item item = new Item(new Dog());

item.get();

Item extends Pet> item2 = new Item(new Dog());

item2.get().out();

/**知道某种限制,但是不知道具体是什么**/

List extends Pet> list = new ArrayList();

/**

* The method add(capture#2-of ? extends Pet) in the type List

* is not applicable for the arguments (Dog)

* list.add(new Dog());

* 从错误代码得知,编译期list的类型是List extends Pet>,所以通配符还是个未知类型;

* 只知道是某种Pet的子类,但是并不知道具体的子类是什么,无法确保类型兼容;

* 即使list.add(new Object()); (Object类型与Pet的子类不兼容) 也是不可以的;

* list.add(null);这个可以;所以对于使用通配符的泛型,只能“取”不能“加”;

* 编译器只允许加null;因为只有 Pet的子类 = null;等式成立;

*/

//list.get(0);

List super Dog> list2 = new ArrayList();

/**

* 这关系到泛型的边界(bounds),list通配符使用的是上边界,无法确定具体的类;

* 这里list2用的是下边界,取放的是Dog某种超类,但是并不知道具体的超类是什么;

* 我们只知道Dog的子类可以跟Dog超类类型兼容

* 所以这种形式的通配符只能“存”不能“取”

*/

list2.add(new Dog());

/**

* list2.add(new Object());

*/

list2.add(new PettyDog());

/**ClassCastException**/

//list2.add((Dog) new Run());

}

}

interface Pet {

public void out();

}

class Item {

T item;

public Item(T item) {

this.item = item;

}

public T get() {

return item;

}

public void put(T item) {

}

}

class Run {}

class Dog extends Run implements Pet {

@Override

public void out() {

System.out.println("The Dog!");

}

public void getMsg(Item> item) {

item.get();

/**

*The method put(capture#3-of ?) in the type Item

* is not applicable for the arguments (Item)

* capture:占位符被称为这个特殊通配符的捕获

* item.put(item);

*/

}

}

class PettyDog extends Dog {

}

推荐阅读:http://www.ibm.com/developerworks/cn/java/j-jtp04298.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值