Java 泛型高级
1、限制泛型可用类型
在定义泛型类别时,预设可以使用任何的类型来实例化泛型中的类型,但是如果想要限制使用泛型的类别时,只能用某个特定类型或者其子类型才能实例化该类型时,使用extends关键字指定这个类型必须是继承某个类,或者实现某个接口。
如下Code
public class ListGenericFlag<T extends List> {
private T[] flagArray;
public T[] getFlagArray() {
return flagArray;
}
public void setFlagArray(T[] flagArray) {
this.flagArray = flagArray;
}
}
测试:
public static void main(String[] args) {
ListGenericFlag<LinkedList> flag1 = new ListGenericFlag<LinkedList>();
ListGenericFlag<ArrayList> flag2 = new ListGenericFlag<ArrayList>();
LinkedList[] likedList = new LinkedList[10];
flag1.setFlagArray(likedList);
ArrayList[] arrayLists = new ArrayList[10];
flag2.setFlagArray(arrayLists);
}
如果出入的是HashMap,就会显示出错

2、当没有指定泛型继承的类型或接口时,默认使用T extends Object,所有默认情况下任何类型都可以作为参数传入。
如下图Code,可以增加任何对象。

3、现在有这样一个需求,需要实现如下
flag = new GenericFlag<ArrayList>()
flag = new GenericFlag<LinkedList()
简单的说,实例化类型持有者时,它必须是实现List的类别或其子类别,要定义这样一个名词,可以使用“?”通配子元,并使用“extends”关键字限定类型持有者的型态。
实现的Code如下
public class GenericTest<T> {
private T flag;
public T getFlag() {
return flag;
}
public void setFlag(T flag) {
this.flag = flag;
}
public static void main(String[] args) {
//固定语法
GenericTest<? extends List> g1 = null;
g1 = new GenericTest<ArrayList>();
g1 = new GenericTest<LinkedList>();
}
}
super为list上面的(用的较少)
GenericTest<? super List> g2 = null;
g2 = new GenericTest<Object>();
4、泛型的继承
定义了Parent类,里面有泛型T1和T2
public class Parent<T1,T2> {
private T1 flag;
private T2 flag2;
public T1 getFlag() {
return flag;
}
public void setFlag(T1 flag) {
this.flag = flag;
}
public T2 getFlag2() {
return flag2;
}
public void setFlag2(T2 flag2) {
this.flag2 = flag2;
}
}
定义了Child类,定义了T3。同时可以访问父类的T1和T2
public class Child<T1,T2,T3> extends Parent<T1, T2> {
private T3 flag3;
public T3 getFlag3() {
return flag3;
}
public void setFlag3(T3 flag3) {
this.flag3 = flag3;
}
}
5、泛型接口的继承
定义一个泛型接口
public interface IParent<T1,T2> {
public void setFlag1(T1 flag1);
public void setFlag2(T2 flag2);
public T1 getFlag1();
public T2 getFlag2();
}
定义泛型接口的实现类
public class ChildClass<T1,T2> implements IParent<T1, T2> {
private T1 flag1;
private T2 flag2;
public void setFlag1(T1 flag1) {
this.flag1 = flag1;
}
public void setFlag2(T2 flag2) {
this.flag2 = flag2;
}
public T1 getFlag1() {
return flag1;
}
public T2 getFlag2() {
return flag2;
}
}
Java 泛型高级的更多相关文章
- java 16-8 泛型高级之通配符
泛型高级(通配符) ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了 ? extends E:向下限定,E及其子类 ? super E:向上限定,E极其父类 import jav ...
- Android(java)学习笔记92:泛型高级之通配符
package cn.itcast_07; import java.util.ArrayList; import java.util.Collection; /* * 泛型高级(通配符) * ?:任意 ...
- Android(java)学习笔记31:泛型高级之通配符
1. 泛型高级之通配符: package cn.itcast_07; import java.util.ArrayList; import java.util.Collection; /* * 泛型高 ...
- Java入门 - 高级教程 - 03.泛型
原文地址:http://www.work100.net/training/java-generic.html 更多教程:光束云 - 免费课程 泛型 序号 文内章节 视频 1 概述 2 泛型方法 3 泛 ...
- 使用java泛型设计通用方法
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 因此我们可以利用泛型和反射来设计一些通用方法. 现在有2张表, 一张user表和一张stu ...
- 大白话说Java泛型(二):深入理解通配符
文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型(二):深入理解通配符> 上篇文章<大白话说Java泛型(一):入门.原理.使用>,我们讲了泛型的产生缘由以及 ...
- java泛型总结(类型擦除、伪泛型、陷阱)
JDK1.5开始实现了对泛型的支持,但是java对泛型支持的底层实现采用的是类型擦除的方式,这是一种伪泛型.这种实现方式虽然可用但有其缺陷. <Thinking in Java>的作者 B ...
- 大白话说Java泛型:入门、使用、原理
文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型:入门.使用.原理> 远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的.当时 Java 程序员们写集合类的代码都 ...
- Java泛型的应用
一.泛型类 package generics; /** * 泛型类,格式:public class 类名<泛型类型1, ...> * @author zhongfg * @date 201 ...
随机推荐
- 修改CentOS的YUM源
CentOS配置本地yum源/阿里云yum源/163yuan源并配置yum源的优先级 1.查看本地yum源 2.把默认yum源备份 mkdir /opt/centos-yum.bak mv /etc/ ...
- IDEA 使用教程(破解2019.1.1)
2019-08-02更新 最新破解方法: ZKVVPH4MIO-eyJsaWNlbnNlSWQiOiJaS1ZWUEg0TUlPIiwibGljZW5zZWVOYW1lIjoi5o6I5p2D5Luj ...
- 云计算/云存储---Ceph和Openstack的cinder模块对接方法
1.创建存储池 在ceph节点中执行如下语句. #ceph osd pool create volumes 2.配置 OPENSTACK 的 CEPH 客户端 在ceph节点两次执行如下语句,两次{y ...
- PAT_A1059
这是一道素数因子分解的问题: 1.先打印素数表出来,以便后期使用,素数表的大小就是10^5级别就可以,因为输入的数是long int(即就是int而已),大小最大21亿(10^10量级的),我们这里素 ...
- 完成N!的程序编写: 1、用循环算法编写; 2、用递归算法编写;
完成N!的程序编写 1.用循环算法编写 #include<iostream> using namespace std; int main(){ int n; long result = 1 ...
- k8s证书之etcd,api,front-proxy配置文件
这几个文件,是要结合前面的master安装脚本的. 所以有的json文件中会出现一些LOCAL_HOSTS_L,THIS_HOST之类的变量. 如果手工单独使用这些文件,要将这些变量替换为合适的IP或 ...
- Java精通并发-wait与notify及线程同步系统总结
notifyAll(): 在上两次中对于Object的wait()和notify()方法的官方doc进行了通读,上一次https://www.cnblogs.com/webor2006/p/11407 ...
- java架构
技术架构是以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis作为数据访问层, Apache Shiro为权限授权层,使用Ehcahe对常用数据进行缓存. ...
- python网络-HTTP协议(28)
一.服务器和客户端介绍 1.什么是服务器? 简而言之:提供服务的机器就是服务器,至于提供什么服务不重要,重要的是要给其他人提供服务.例如:FTP服务器可以提供文件下载,SMTP服务器等等,不同的服务器 ...
- SQL中 count(*)和count(1)的对比,区别
执行效果: 1. count(1) and count(*) 当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和coun ...