当前位置:网站首页 > Java教程 > 正文

java 通配符 教程



泛型的本质,其实就是将类型参数化,就是对于要操作的数据类型指定为一个参数。泛型,是为了在编译的时候能检测到非法的类型。而使用通配符,则是在此之上做的一个扩展,使泛型的使用更加的灵活。

如果不是用泛型,想要对参数类型的“任意化”,就要做显式的强制类型转换。但这里有个问题。请看一下代码。

 

从上面的额代码可看出, 省去了强制转换,可以在编译时候检查类型安全。

常用的通配符有:

其实也可以是A、B、C、D、E等的字母代替。使用 只不过是约定俗成而已。

的约定如下:

:(type) 表示具体的一个java类型。

:代表Element。

:分别代表java键值中的Key Value。

:无界通配符,表示不确定的 java 类型

上边界:用extends 关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。

有时候,为什么要使用通配符,而不是简单的泛型呢?其中有一个很重要的原因,就是使用通配符, 可以让你的方法更具有通用性。

比如,有一个父类Animal,然后该父类有几个子类。比如猫猫、狗等。它们都有名字的属性,比如你要定义一个动物列表的变量。

你可以这样写:

 

也可以这样写

 

如果想要获取列表里面的明细属性,则:

 

方式二的入参写法,限定了上界,但是不关心具体类型是什么,所以对于传入的类型是Animal、Animal的字类的都能支持,方式一则不行。

也可以使用 形式的通配符,实现向上转型

向上转型:

 

使用<? extends Animal> 形式的通配符,实现向上转型。

 

这里有个缺陷,不能对list做添加的操作,只能做读取。

当使用extends通配符时,我们无法想list中添加任何东西(null除外),那又为什么可以取出东西呢?

因为无论取什么出来,我们都可以通过向上转型用Animal指向它,这在Java中是被允许的,但不确定取到的是什么,所以必须用上限Animal接收。

 

又叫超类型通配符。与extends特性完全相反。

下边界: 用 super 进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至 Object。

 

dst 类型可以看作是 “大于等于” src 的类型,这里的“大于等于”是指 dst 表示的范围比 src 要大,因此装得下 dst 的容器也就能装 src 。

参数声明

 

list元素的类型可以是任何Dog的父级,JVM在编译的时候当然是无法确定具体是哪个类型,但是可以确定的是任何的Dog的子类都可以转为Dog类,而任何的Dog的父类都不能转为Dog类。

所以,若使用了通配符,则只能存入T类型及T类型的子类对象:

 
 

取出数据的时候,JVM在编译时并不能确定具体的父级,所以安全起见,就用顶级的父级Object来取出数据。这样就可以避免发生强制类型转换异常了。也只能使用Object取数据。

使用的形式是一个单独的 ,表示无任何的限定。

表示 是持有某种特定类型的 List,但是不知道具体是哪种类型,因此时不安全的,即不能添加数据。但是可以用来取数据。

先看一下代码:

 
 
 

但是不管用T还是用? ,它们的共同点都是不能往list里添加数据,且在获取数据的时候只能用Object来接收。

其实,? 和T都是表示不确定的类型,区别在于我们可以对 T 进行操作,但是对 ?不行,比如如下这种 :

 

通常用于泛型类和泛型方法的定义。

通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法。

例如

 
 

比如接口Apple继承Fruits ,接口Fruit继承Botany。下面就是T的多重限定的写法。使用 &

 

使用 & 符号设定多重边界(Multi Bounds),指定泛型类型 T 必须是 Fluit和 Apple的共有子类型,此时变量 t 就具有了所有限定的方法和属性。对于通配符来说,因为它不是一个确定的类型,所以不能进行多重限定。

类型参数 T 只具有 一种 类型限定方式:

 

但是通配符 ? 可以进行 两种限定:

 

通配符的使用可以对泛型参数做出某些限制,使代码更安全,对于上边界和下边界限定的通配符总结如下:

使用通配符对泛型参数做出限制,能是代码更加的安全。

上下边界限定的通配符总结如下:

  1. 使用 的形式,表示该元素类型的范围必须是 的字类( 包含 本身)。
  2. 使用 形式,表示该元素类型是 的超类型 ( 包含 本身 )。

版权声明


相关文章:

  • 刷黑曜石教程java版2024-12-31 22:02:01
  • java webservice 视频教程2024-12-31 22:02:01
  • java低代码教程2024-12-31 22:02:01
  • java if教程2024-12-31 22:02:01
  • Java天气教程2024-12-31 22:02:01
  • java函数式编程教程2024-12-31 22:02:01
  • redisson教程 java2024-12-31 22:02:01
  • java2实用教程第四版.pdf2024-12-31 22:02:01
  • java教程1092024-12-31 22:02:01
  • java新人入门教程2024-12-31 22:02:01