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. Android笔记(五十一) 短信验证码集成——mob平台

    官方网站:www.mob.com 注册帐号,下载SDK,导入SDK就不说了,主要写一下简单集成如何使用,以后忘记了也可以翻着看看. 详细的可以参考官方文档: http://wiki.mob.com/a ...

  2. urllib模块中parse函数中的urlencode和quote_plus方法

    本来只是向看一下quote_plus的作用,然后发现urlencode方法也是很方便的一个组合字符串的方法首先是介绍一下urlencode,他是将一些传入的元素使用&串联起来,效果如下: &g ...

  3. Java中创建线程主要有三种方式

    一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...

  4. 烂笔头@WP 的博文仅供自己学习的备忘录

    前记:本博主的博文仅供自己学习的备忘录. 说明:很久未用博客,登录密码已忘记,费劲找回来,特写本博文申明.因为,今天邮件收到一条博文的评论,有谩骂本博主之意,甚觉委屈.所以,写以下文字说明“1.我的博 ...

  5. 版本控制Git研究二

    经过好几周的工作忙碌,终于可以有时间静下心来学习东西了,做为崇尚技术的人来说,应该是最幸福的时光了,呵呵,当然也是宅神的表现啦,话不多说,继续git的学习,上次已经对git的一些概念进行了说明,具体可 ...

  6. JAVA对象结构

    对象的内存布局 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header),实例数据(Instance Data)和对象填充(Padding). 实例数据:对象真正存储的 ...

  7. jdk、jre、jvm三者联系

    JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE.Java工具和Java基础类库.Java Runtime Enviro ...

  8. python 对象引用计数增加和减少的情况

    对象引用计数增加的情况: 1.对象被创建:x=4 2.另外的别人被创建:y=x 3.被作为参数传递给函数:foo(x)  ->会增加2 4.作为容器对象的一个元素:a=[1,x,'33'] 对象 ...

  9. 关于JS变量和作用域详解

    ECMAScript 变量: 1.基本类型值(简单数据段) 2.引用类型值(可能由过个值构成的对象) → 保存在内存中的对象 ------ 动态属性: 只能给引用型值动态添加新属性,以便将来使用. - ...

  10. HDU6072 Logical Chain

    题意:动态修改图 \(G\) 的边集,求每次修改后的 \(\sum c\times (c−1) / 2\) (记每个强连通分量中的点数量为 \(c\) ).其中修改操作共 \(m\) 次,每次最多改 ...