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 ...
随机推荐
- IntelliJ Idea 依赖包下载成功,代码里无法import问题解决方法
今天clone一个github上的基于maven的项目IntelliJ Idea 依赖包下载成功,代码里无法import.解决方法:删掉原来的.iml,刷新. 如果不行,可尝试:File->In ...
- kafka原理与组件
一.什么是kafkakafka的目标是实现一个为处理实时数据提供一个统一.高吞吐.低延迟的平台.是分布式发布-订阅消息系统,是一个分布式的,可划分的,冗余备份的持久性的日志服务.Kafka使用场景:1 ...
- 码云和Git使用说明
Git下载网站: https://git-scm.com/download/win 码云网站 :https://gitee.com 下载Git,并一路下一步安装. 鼠标空白处右键点击,出现两个 ...
- python 编码设置
py 文件设置编码: # -*- coding: utf-8 -*- #coding=utf-8 两种方式任选一种即可 输出到浏览器设置编码: import io import sys sys.std ...
- Flink原理(七)——动态表(Dynamic tables)
前言 本文是结合Flink官网,个人理解所得,若是有误欢迎留言指出,谢谢!文中图皆来自官网(链接[1]). 本文将随着下面这个问题展开,针对该问题更为生动的解释可以参见金竹老师的分享(链接[2]). ...
- mysql技术内幕--innodb存储引擎图解
1. Innodb存储引擎 2. Innodb文件 3. Innodb表 4. Innodb事务 5. innodb索引与算法 6 ...
- MYSQL中的乐观锁实现(MVCC)简析
https://segmentfault.com/a/1190000009374567#articleHeader2 什么是MVCC MVCC即Multi-Version Concurrency Co ...
- selenium常用的API(二)浏览器窗口设置
浏览器窗口最大化 # encoding=utf-8 from selenium import webdriver driver = webdriver.Ie(executable_path=" ...
- BAT文件的调用
分成2个步骤,首先生成一个bat文件,然后调用批处理文件 1.生成.bat文件 入参为文件的内容,filePath为绝对路径,且需要扩展名(这个方法不局限于生成.bat文件,也可以生成其他扩展名文件) ...
- dedecms搜索下拉
今天公司用dedecms做一个音乐站,要用到下拉标题搜索,我在本地做的一个测试结果 以下是代码部分(ps:二级栏目不用的可以删除代码,如果只调用某一个栏目或者2个栏目可以用typeid='1,2'):