关于JAVA泛型中的通配符类型
之前对JAVA一知半解时就拿起weiss的数据结构开始看,大部分数据结构实现都是采取通配符的思想,好处不言而喻。
首先建立两个类employee和manager,继承关系如下。其次Pair类是一个简单的泛型类。
通配符的作用就是在泛型设计程序中允许类型参数变化
子类型限定
- Pair<? extends Employee>
extends可以理解为是向下的 ↓
即所有Employee的子类都是可以的,可以理解为Pair<Manager>是Pair<? extends Employee>的子类型
- /*
- 打印雇员对的方法
- */
- public static void printBuddies(Pair<? extends Employee> p)
- {
- Employee first=p.getFirst();
- Employee second-p.getSecond();
- System.out.println(...)
- }
上例的方法可以将Pair<Manager>传递过去
通配符限定还有个超类型限定
- ? super Manager
super关键字如同字面意思,是↑的,即所有Manager父类都是可以的。
- /*
- 数组放入奖金最高和最低的经理
- */
- public static void minmaxBonus(Manager[] a,Pair<? super Manager> result)
- {
- if(a.length==0)
- return;
- Manager min=a[0];
- Manager max=a[0];
- for(int i=0;i<a.length;i++)
- {
- if(min.getBonus()>a[i].getBonus())
- min=a[i];
- if(min.getBonus()<a[i].getBonus())
- max=a[i];
- }
- result.setFirst(min);
- result.setSecond(max);
- }
直观的讲,带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象读取
下面定义一个类扩展了comparable接口
- class getMax implements Comparable<Integer>{
- @Override
- public int compareTo(Integer o) {
- // TODO Auto-generated method stub
- return 0;
- }
- }
可以观察到Comparable接口本身就是一个泛型类型,实现后会重写compareTo方法。
现在可以给出一个泛型max限定方法
- public static <T extends Comparable> T max(..)
- public class MyGenerics {
- public static void main(String[] args) {
- Integer[] nums=new Integer[]{10,8};
- System.out.println(max(nums));
- }
- public static <T extends Comparable> T max(T[] a){
- if(a[0].compareTo(a[1])>0)
- return a[0];
- else
- return a[1];
- }
- }
- //output:10
但是compareTo方法下会标黄,提示
Type safety: The method compareTo(Object) belongs to the raw type Comparable.
References to generic type Comparable<T> should be parameterized
大意就是类型安全什么的,因为comparable接口已经是泛型接口comparable<T>限定了比较的类型
- public static <T extends Comparable<T>> T max(..)
//所以最好采用这种形式
比较难理解的就是
- public static <T extends Comparable<? super T>> T max(...)
与上文比较主要是有<T>与<? super T>的区别,文章的开头已经清楚 ? super T 意思是所有T的超类都是可以的。
现在可以把T换成Manager类
- public static <Manager extends Comparable<? super Manager>> Manager max(...)
如果没有 ? super 的话,上面的方法只能对Manager类进行操作,但是有个超类型限定,Emoployee也可以使用这个方法。
关于JAVA泛型中的通配符类型的更多相关文章
- Java泛型中的通配符T,E,K,V
Java泛型中的通配符T,E,K,V 1.泛型的好处 2.泛型中的通配符 2.1 T,E,K,V,? 2.2 ?无界通配符 2.3 上界通配符 < ? extends E> 2.4 下界通 ...
- Java泛型中的通配符
Java泛型中的通配符可以直接定义泛型类型的参数.而不用把该函数定义成泛型函数. public class GenericsTest { public static void main(String[ ...
- 【转】聊一聊-JAVA 泛型中的通配符 T,E,K,V,?
原文:https://juejin.im/post/5d5789d26fb9a06ad0056bd9 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型 ...
- Java 泛型中的通配符
本文内容如下: 1. 什么是类型擦除 2.常用的 ?, T, E, K, V, N的含义 3.上界通配符 < ?extends E> 4.下界通配符 < ?super E> 5 ...
- JAVA泛型中的有界类型(extends super)(转)
JDK1.5中引入了泛型(Generic)机制.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...
- JAVA 泛型中的通配符 T,E,K,V,?
前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说所操作的数据 ...
- Java泛型中的通配符的使用
package com.srie.testjava; import java.util.ArrayList; import java.util.List; public class TestClass ...
- Java泛型中的协变和逆变
Java泛型中的协变和逆变 一般我们看Java泛型好像是不支持协变或逆变的,比如前面提到的List<Object>和List<String>之间是不可变的.但当我们在Java泛 ...
- Java泛型中extends和super的区别?
<? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...
随机推荐
- VS优化编译配置
在使用VS2010编译C++程序的时候,每次修改工程中的某一个文件,点击“生成-仅用于项目-仅生成**”时,往往都是整个工程都需要重新编译一遍.由于这个工程代码量太大,每次编译完成都需要将近10分钟左 ...
- 使用python管理Cisco设备-乾颐堂
今天发现一个老外使用python写的管理cisco设备的小框架tratto,可以用来批量执行命令. 下载后主要有3个文件: Systems.py 定义了一些不同设备的操作系统及其常见命令. Conne ...
- [SoapUI] DataSource, DataSourceLoop, DataSink
Script assertion in login:
- APUE(7)---进程环境
一.main函数 C程序总是从main函数开始执行.main函数的原型是: int main(int argv, char *argv[]); 当内核执行C程序时,在调用main前先调用一个特殊的启动 ...
- 基于Struts2开发快递收发系统 毕业设计 源码
基于Struts2开发快递收发系统 开发环境: Windows操作系统 开发工具:Eclipse/MyEclipse+Jdk+Tomcat6+MySql数据库 运行效果图: 此源码经过详细测试 保证 ...
- Android 使用pk10系统架设RecyclerView实现轮播图
一.需求 ViewPager有个天生的缺陷是View无法重用,此外pk10系统架设详情咨询[企娥166848365]ViewPager的滑动过程会频繁requestLayout,尽管可以通过addVi ...
- EF 查询视图返回重复数据的问题
在特殊的情况下查询过滤视图 会出现重复的数据结果集(返回的多条数据结果一致). 原因是啥:主键 在数据库设计的理念中:每个表都应该的唯一的主键.但视图不同,EF中会自动按视图的最前几个非空型字段设置为 ...
- Decoding VOX Files in C# (Converting VOX Files to WAV Files)
I wrote a C# class to decode VOX files into WAV files. It follows the Dialogic ADPCM specificationst ...
- Redis分布式锁方案
- pageadmin建站软如何修改和设置iis站点应用程序池
很多用户第一次安装PageAdmin建站系统时候会出现这个错误,主要原因: 1.首选打开iis站点基本设置,可以看到当前站点对应的应用程序池,如下图: 可以看到当前站点用的程序池名为MyAppPool ...