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. Spark运行原理【史上最详细】

    https://blog.csdn.net/lovechendongxing/article/details/81746988 Spark应用程序以进程集合为单位在分布式集群上运行,通过driver程 ...

  2. SpringBoot AOP概念及使用Demo

    AOP核心概念1.横切关注点 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点2.切面(aspect)->(通知+切点) 类是对物体特征的抽象,切面就是对横切关注点的抽象.通知+切 ...

  3. Scrum会议博客以及测试报告

    3组Alpha冲刺阶段博客目录 一.Scrum Meeting1. 第六周会议记录(链接地址:https://www.cnblogs.com/Cherrison-Time/articles/11788 ...

  4. 实用mysql数据库命令

    连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) 创建授权:grant select on 数据库.* to 用户名@登 ...

  5. Servlet的入门

    什么是Servlet? Servlet是运行在服务端的java小程序,是sun公司提供的一套规范,用来处理客户端请求.响应给浏览器的动态资源.Servlet是JavaWeb三大组件之一(Setvlet ...

  6. nodejs保存图片至本地

    const request = require("request"); const fs = require("fs"); for(let i = 1; i & ...

  7. 创建型模式(三) 抽象工厂模式(Abstract Factory)

    一.动机(Motivation) 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 如何应对这种变化?如何绕过常规的对象创建方法(ne ...

  8. maven项目重构-使用了mybatis generator插件

    1.在worksapce下,dos窗口输入spring init -g=com.briup.apps -a=poll3 -d=mysql,mybatis,web poll3 2.下载依赖,cd到pol ...

  9. Eclipse下,Maven+JRebel安装破解手记

    Java开发中,Maven已经是标配,使用JRebel能大大地提高工作效率,特别是在Web开发中,不用重启tomcat,大大地提高了工作效率. 1.前提条件 安装JDK 8 安装eclipse, ec ...

  10. Redis-3.2.1集群内网部署

    摘要: Redis-3.2.1集群内网部署 http://rubygems.org国内连不上时的一种Redis集群部署解决方案.不足之处,请广大网友指正,谢谢! 一. 关于redis cluster  ...