【Java范型三】Java范型详解之范型类型通配符
Java  /  管理员 发布于 4年前   283
定义如下一个简单的范型类,
package com.tom.lang.generics;public class Generics<T> { private T value; public Generics(T value) { this.value = value; }}
@Test public void test() { Generics<Integer> v1 = new Generics<Integer>(10); Generics<Long> v2 = new Generics<Long>(10L); Generics<Object> v3 = new Generics<Object>(new Object()); v1 = v2; //编译错 v2 = v1; //编译错 v3 = v1; //编译错 }
在Java范型一中给已经说到了,上面的三种类型是不兼容的,即v1,v2,v3赋值语句都有编译错。这个例子代码表明,确定范型类的类型,一方面包括范型类本身,另一方面包括类型参数。范型类型只有类型和类型参数相同,才能认为类型是兼容的。
范型类的类型参数不同导致的类型的变量不能有存放到范型集合中,使用<?>可以通配类型参数,
Generics<?>[] array = new Generics[3]; Generics<Integer> v1 = new Generics<Integer>(10); Generics<Long> v2 = new Generics<Long>(10L); Generics<Object> v3 = new Generics<Object>(new Object()); array[0] = v1; array[1] = v2; array[2] = v3;
使用<? extends SuperClass>定义限制类型的范型通配符,例如
Generics<? extends Number>[] array = new Generics[3]; Generics<Integer> v1 = new Generics<Integer>(10); Generics<Long> v2 = new Generics<Long>(10L); Generics<Object> v3 = new Generics<Object>(new Object()); array[0] = v1; array[1] = v2; array[2] = v3; //编译错
使用下面的限制类型的范型通配符,会有编译错,这是为什么?也就是说,通配符不能出现在范型类的范型参数列表中?
public class Generics<? extends Number> {}
Generics2<? super java.sql.Date>[] array = new Generics2[3]; Generics2<java.util.Date> v3 = new Generics2<java.util.Date>(new java.util.Date()); array[0] = v3;
上例中,数组中的每个元素的类型参数的类型都是java.sql.Date的父类
带有泛型通配符的泛型类,由于通配符只有在运行时才能确定其真正的类型,因此,泛型通配符在上使用上有一定的限制,
1. 如下的定义会有编译错,原因是?是任意类型,在类中无法使用
public class Generics<? extends Number> {}
只能像如下的定义,T这个类型参数在编译时虽然没有确定,但是编译时可以知道这个类型是继承自Number的,因此Number可用的方法,对于T来说也可以使用
public class Generics<T extends Number> {}
2. 泛型通配符可以用于一致的赋值,例如
Generics<? extends Number>[] array = new Generics[3]; Generics<Integer> v1 = new Generics<Integer>(10); Generics<Long> v2 = new Generics<Long>(10L); Generics<Object> v3 = new Generics<Object>(new Object()); array[0] = v1;
3.又如下面的定义,这个变量定义,可以将泛型类型赋值给var,达到一种Javascript弱类型的效果
public class Generics <T> { public static void main(String[] args) { Generics<?> var = null; var = new Generics<String>(); var = new Generics<Date>(); }}
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号