Java泛型小结(五)
Java泛型总结(五)?通配符类型1)一个简单的通配符类型实例:Pair? extends Employee,表示任何泛型Pair类型
Java泛型总结(五)
?
通配符类型1)一个简单的通配符类型实例:Pair<? extends Employee>,表示任何泛型Pair类型,它的类型参数是Employee的子类,像Pair<Manager>(其中Manager是Employee的子类),而不是Pair<String>,Pair<Date>等。在这里有个关键的地方,即get方法的安全性和set方法的不安全性。例如:Pair<Manager> pair = new?Pair<Manager>(a, b);pair.getFirst是安全的,因为它返回的是Employee的子类型。pair.setFirst则是不安全的,因为没办法知道具体应该set哪个子类。
//?Manager和Ceo都是Employee的子类Pair2<Manager> pair =?
new?Pair2<Manager>();Pair2<??
extends?Employee> epair = pair;Employee first = epair.getFirst(); // OKEmployee ceo =?
new?Ceo();epair.setFirst?(ceo);?// Error 编译错误
2)和上面对应的是? super?Manager 表示的类型参数是Manager的超类型,和上面描述的正好相反,我们可以为方法提供参数,但是不能使用返回值。这个也很好理解,试想你得到一个返回值,你只知道是Manager的超类型,但是你无法知道具体是哪个类型,因此你无法这么做;但是,提供参数就不一样了,只要是Manager的超类型就可以了,并且,我们在方法中使用到的参数值,Manager能提供的,Manager的超类型也同样可以提供。
最后,总结规则:Intuitively speaking, wildcards with supertype bounds let you write to a generic object,
wildcards with subtype bounds let you read from a generic objects.简单的说,带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象读取。