泛型[6]声明变量类型时使用泛型通配符
来源:互联网 发布:档案管理系统软件 编辑:程序博客网 时间:2024/06/06 01:23
可以在声明变量类型的时候使用?通配符。
并且还可以结合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) {
}
}
}
- 泛型[6]声明变量类型时使用泛型通配符
- 【java泛型】类型变量和通配符
- 黑马程序员 使用通配符和使用泛型变量
- 枚举变量的使用和类型声明
- js变量的声明、类型、以及使用
- 深入理解泛型,类型通配符<?>,类型通配符上限,下限
- 在 Java 的泛型类型中使用通配符
- 泛型类型的子类及通配符的使用
- 泛型类型的子类及通配符的使用
- 在 Java 的泛型类型中使用通配符
- 在 Java 的泛型类型中使用通配符
- Java 泛型类型通配符
- 变量 声明变量 声明变量类型分类
- JS声明变量类型
- declare 声明变量类型
- 声明变量类型
- 声明变量类型
- 声明变量类型
- Android业务组件化之Gradle和Sonatype Nexus搭建私有maven仓库
- 今日学习总结一Django相关问题
- CSS3 变形、过渡、动画、关联属性浅析
- (2441): xth 砍树
- 编程面试题
- 泛型[6]声明变量类型时使用泛型通配符
- Javascript闭包——懂不懂由你,反正我是懂了
- 最受DevOps欢迎的五种工具
- Jedis使用java操作Redis
- 个性化学习之"知识组件"[Knowledge component]的理解
- HDU 1003 Max Sum (经典dp入门题)
- 网格
- 4.约束&&视图
- 递归