java泛型 wildcard

import java.util.ArrayList;
import java.util.List;

public class WildCard {
	public static void main(String[] args) {
		Item<Dog> item = new Item<Dog>(new Dog());
		item.get();
		Item<? extends Pet> item2 = new Item<Dog>(new Dog());
		item2.get().out();
		/**知道某种限制,但是不知道具体是什么**/
		List<? extends Pet> list = new ArrayList<Dog>();
		/**
		 * The method add(capture#2-of ? extends Pet) in the type List<capture#2-of ? extends Pet>
		 *  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<Dog>();
		/**
		 * 这关系到泛型的边界(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 extends Pet> {
	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<capture#3-of ?>
		 * is not applicable for the arguments (Item<capture#4-of ?>)
		 * capture:占位符被称为这个特殊通配符的捕获
		 * item.put(item);
		 */
	}
}
class PettyDog extends Dog {
}



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



转载于:https://my.oschina.net/u/782865/blog/198906

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值