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 泛型高级的更多相关文章

  1. java 16-8 泛型高级之通配符

    泛型高级(通配符) ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了 ? extends E:向下限定,E及其子类 ? super E:向上限定,E极其父类 import jav ...

  2. Android(java)学习笔记92:泛型高级之通配符

    package cn.itcast_07; import java.util.ArrayList; import java.util.Collection; /* * 泛型高级(通配符) * ?:任意 ...

  3. Android(java)学习笔记31:泛型高级之通配符

    1. 泛型高级之通配符: package cn.itcast_07; import java.util.ArrayList; import java.util.Collection; /* * 泛型高 ...

  4. Java入门 - 高级教程 - 03.泛型

    原文地址:http://www.work100.net/training/java-generic.html 更多教程:光束云 - 免费课程 泛型 序号 文内章节 视频 1 概述 2 泛型方法 3 泛 ...

  5. 使用java泛型设计通用方法

    泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 因此我们可以利用泛型和反射来设计一些通用方法. 现在有2张表, 一张user表和一张stu ...

  6. 大白话说Java泛型(二):深入理解通配符

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型(二):深入理解通配符> 上篇文章<大白话说Java泛型(一):入门.原理.使用>,我们讲了泛型的产生缘由以及 ...

  7. java泛型总结(类型擦除、伪泛型、陷阱)

    JDK1.5开始实现了对泛型的支持,但是java对泛型支持的底层实现采用的是类型擦除的方式,这是一种伪泛型.这种实现方式虽然可用但有其缺陷. <Thinking in Java>的作者 B ...

  8. 大白话说Java泛型:入门、使用、原理

    文章首发于[博客园-陈树义],点击跳转到原文<大白话说Java泛型:入门.使用.原理> 远在 JDK 1.4 版本的时候,那时候是没有泛型的概念的.当时 Java 程序员们写集合类的代码都 ...

  9. Java泛型的应用

    一.泛型类 package generics; /** * 泛型类,格式:public class 类名<泛型类型1, ...> * @author zhongfg * @date 201 ...

随机推荐

  1. IntelliJ Idea 依赖包下载成功,代码里无法import问题解决方法

    今天clone一个github上的基于maven的项目IntelliJ Idea 依赖包下载成功,代码里无法import.解决方法:删掉原来的.iml,刷新. 如果不行,可尝试:File->In ...

  2. kafka原理与组件

    一.什么是kafkakafka的目标是实现一个为处理实时数据提供一个统一.高吞吐.低延迟的平台.是分布式发布-订阅消息系统,是一个分布式的,可划分的,冗余备份的持久性的日志服务.Kafka使用场景:1 ...

  3. 码云和Git使用说明

    Git下载网站: https://git-scm.com/download/win 码云网站     :https://gitee.com 下载Git,并一路下一步安装. 鼠标空白处右键点击,出现两个 ...

  4. python 编码设置

    py 文件设置编码: # -*- coding: utf-8 -*- #coding=utf-8 两种方式任选一种即可 输出到浏览器设置编码: import io import sys sys.std ...

  5. Flink原理(七)——动态表(Dynamic tables)

    前言 本文是结合Flink官网,个人理解所得,若是有误欢迎留言指出,谢谢!文中图皆来自官网(链接[1]). 本文将随着下面这个问题展开,针对该问题更为生动的解释可以参见金竹老师的分享(链接[2]). ...

  6. mysql技术内幕--innodb存储引擎图解

    1. Innodb存储引擎        2. Innodb文件        3. Innodb表        4. Innodb事务        5. innodb索引与算法        6 ...

  7. MYSQL中的乐观锁实现(MVCC)简析

    https://segmentfault.com/a/1190000009374567#articleHeader2 什么是MVCC MVCC即Multi-Version Concurrency Co ...

  8. selenium常用的API(二)浏览器窗口设置

    浏览器窗口最大化 # encoding=utf-8 from selenium import webdriver driver = webdriver.Ie(executable_path=" ...

  9. BAT文件的调用

    分成2个步骤,首先生成一个bat文件,然后调用批处理文件 1.生成.bat文件 入参为文件的内容,filePath为绝对路径,且需要扩展名(这个方法不局限于生成.bat文件,也可以生成其他扩展名文件) ...

  10. dedecms搜索下拉

    今天公司用dedecms做一个音乐站,要用到下拉标题搜索,我在本地做的一个测试结果 以下是代码部分(ps:二级栏目不用的可以删除代码,如果只调用某一个栏目或者2个栏目可以用typeid='1,2'):