在Java通用类型中使用通配符
Java从版本5开始引入了类属(generics )机制。 我们知道Java的泛型类型是普通的Java类型,如java.lang.String,java.io.File。 例如,以下两种变量的类型互不相同:
列表列表列表bj=new ArrayList (;
列表列表列表str=new ArrayList (;
字符串是Object的子类,但列表和列表之间并不存在——列表不是列表的子类或子类的关系。 下面的代码演示如何将具有List类型的变量分配给期望的List类型参数。 编译器在编译时报告编译错误。
import java.util.ArrayList;
import java.util.List;
公共类通用类型测试{
publicstaticvoidtestMTD{
}
publicstaticvoidmain (字符串[ ] args ) {
列表测试列表=new ArrayList;
//abovelinewillcauseacompileerror
测试列表(test MTD );
}
}
如果testMtd希望接受任意通用型参数,我们应该使用吗? 通配符满足这个要求。 List一种通用类型,即任意类型的对象数组。 可以将上述代码修改为:
publicstaticvoidtestMTD{
}
但是,在这种情况下,testMtd参数被接受的类型对于程序员设计的意图来说可能太宽了。 这是因为testMtd可能只希望接受AbstractList及其子类类型的变量,而不接受AbstractSet、Random和Locale等类型的变量。 通配符有限制。 幸运的是,Java 5的通用机制已经考虑到了这一点,可以使用“边界通配符”(bounded wildcard )格式满足这一要求。 让我们再次修改testMtd :
publicstaticvoidtestmtd (列表扩展数据库结构列表)。
}
这样可以将类型变量(如List和List )传递给testMtd方法,但将包含其他类型元素的List泛型变量传递给testMtd方法是非法的。 除了upper bounded wildcard之外,还可以使用“下边界通配符”(lower bounded wildcard ),如列表超级结构列表。
最后总结使用通配符的总称型的三种形式。
通用类型
通用型peextendsupperboundtype
通用型super lower bound type