泛型[6]声明变量类型时使用泛型通配符
2017-03-06 13:24
639 查看
可以在声明变量类型的时候使用?通配符。
并且还可以结合extends和super使用。(对比“定义&使用”小节,只出现了extends)
注意是声明的时候可以使用,比如说
1、变量的类型(局部变量&成员变量)
List<?extends
Fruit>list1
=new ArrayList<Fruit>();
2、方法形参的类型
publicstaticvoid
test(List<?extends
Fruit>list)
3、定义泛型
添加extends限制时extends的类型(这个后面还会具体讲)
publicstatic
<TextendsComparable<?
super
T>>void
sort(List<T>list){}
而如下写法是不正确的。(在定义泛型方法时泛型元素使用了通配符)
使用?表示可以使用的时候可以传递任意类型(Object及其子类)。对这个类型的操作都会按照Object来对待。(类似于泛型擦除,但不等同)
Java Code
import java.util.ArrayList; public class Test { public static void main(String[] args) { // 符合类型都可以使用 ArrayList<?> list = new ArrayList<Integer>(); list = new ArrayList<Object>(); // 这个地方只能放入null,因为?可能是任意类型,而只有null可以看作任意类型 // 结合后面extends&super理解 list.add(null); // 按照Object类型来使用 Object object = list.get(0); test(list); } public static void test(ArrayList<?> list) { } } |
还可以将?结合extends和super使用。注意将其用于声明形式参数类型时,该对象所能支持的方法跟普通的有较大差异。
以如下类型继承关系为例
Java Code
import java.util.ArrayList; import java.util.List; public class ExtendsTest { List<? extends Fruit> list2; public static void main(String[] args) { //1、传递的时候可以传递子类 List<Fruit> list1 = new ArrayList<Fruit>(); test(list1); List<Apple> list2 = new ArrayList<Apple>(); test(list2); List<? extends Apple> list3 = new ArrayList<FujiApple>(); test(list3); List<? extends Fruit> list4 = new ArrayList<Fruit>(); test(list4); // List<?> list5=new ArrayList<Fruit>(); // List<? extends Object> list5=new ArrayList<Fruit>(); // test(list5); } public static void test(List<? extends Fruit> list) { //2、 这个地方只能添加null,因为如果传递进来的是ArrayList<Apple>,就不能add Fruit, 如果传递进来的是ArrayList<FujiApple>, 则不能add Apple list.add(null); // list.add(new Fruit()); // list.add(new Apple()); //3、取出来是Fruit类型 for (Fruit fruit : list) { fruit.toString(); } } } |
Java Code
import java.util.ArrayList; import java.util.List; public class SuperTest { public static void main(String[] args) { //1、传递的时候可以传递父类 List<Apple> list1 = new ArrayList<Apple>(); test(list1); List<Fruit> list2 = new ArrayList<Fruit>(); test(list2); List<? super Apple> list3 = new ArrayList<Apple>(); test(list3); List<? super Fruit> list4 = new ArrayList<Object>(); test(list4); // List<? super FujiApple> list6 = new ArrayList<FujiApple>(); // test(list6); // List<?> list7 = new ArrayList<Apple>(); // test(list7); } public static void test(List<? super Apple> list) { //2、这个地方可以添加Apple的子类,这样传递进来的时候可以向上转换 list.add(new Apple()); list.add(new FujiApple()); // list.add(new Fruit());// //3、由于只要求是Apple的父类,那么里面可能是任何类型,所以取出来是Object for (Object object : list) { } } } |
相关文章推荐
- 关于如何使用反射声明一个泛型类型变量(泛型参数是动态的)的问题
- 使用临时表与声明一个表数据类型的变量有什么区别
- js变量的声明、类型、以及使用
- 建议35:使用default为泛型类型变量指定初始值
- 变量的声明与使用(常见的基础数据类型),运算符
- 枚举变量的使用和类型声明
- 关于数组声明元素数量可否使用enum类型变量的测试
- 在静态方法中使用变量 (需要将变量在.m文件中声明未静态static 类型)
- 编写高质量代码改善C#程序的157个建议——建议35:使用default为泛型类型变量指定初始值
- SQL SERVER2000教程-第五章 处理数据 第二十四节 使用table数据类型变量获得临时表
- C语言编程艺术--C语言中enum变量类型的使用
- 泛型类型的子类及通配符的使用
- C# 3.0新特性初步研究 Part1:使用隐含类型的本地变量_C#教程
- 泛型集合类型,赋予集合业务意义,增强集合的抽象使用
- (转)GeneXus初学者变量的声明和使用
- 泛型集合类型,赋予集合业务意义,增强集合的抽象使用
- 泛型集合类型,赋予集合业务意义,增强集合的抽象使用
- 变量 声明变量 声明变量类型分类
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(7):服务器端和客户端数据类型的自动转换:泛型集合类型
- C# 3.0新特性初步研究 Part1:使用隐含类型的本地变量_C#教程