类型的参数化

  • 泛型类可以同时设置多个参数
  • 泛型类可以继承泛型类
  • 泛型类可以实现泛型接口

示例--泛型类

package com.date;

public class GenericDemo {
public static void main(String[] args) {
GenClass<String> genClass=new GenClass<String>("tanlei");
System.out.println(genClass.getData());
GenClass<Integer> genClass2=new GenClass<Integer>(100);
System.out.println(genClass2.getData());
}
} //创建一个泛型类
class GenClass<T>{
private T data; public GenClass(T data) {
this.data = data;
} public T getData() {
return data;
} public void setData(T data) {
this.data = data;
} }
  • 泛型类可以同时设置多个参数
package com.date;

public class GenericDemo {
public static void main(String[] args) { Genclass2<String,Integer> genclass2=new Genclass2("tanlei", 100);
System.out.println(genclass2.getData1());
System.out.println(genclass2.getData2()); }
} class Genclass2<T1,T2>{
private T1 data1;
private T2 data2;
public Genclass2(T1 data1, T2 data2) {
this.data1 = data1;
this.data2 = data2;
}
public T1 getData1() {
return data1;
}
public void setData1(T1 data1) {
this.data1 = data1;
}
public T2 getData2() {
return data2;
}
public void setData2(T2 data2) {
this.data2 = data2;
} }
  • 泛型类可以继承泛型类
package com.date;

public class Grneric {
public static void main(String[] args) {
subClass<String,Integer> subClass=new subClass("xiaotan", 22);
System.out.println(subClass.Show1());
subClass.show2(22);
}
} interface Iinfo<T2>{
public void show2(T2 var2) ;
} class superClass<T1>{
private T1 var1; public superClass(T1 var1) {
this.var1 = var1;
} public T1 Show1() {
return var1;
}
} class subClass<T1,T2> extends superClass<T1> implements Iinfo<T2>{
private T2 var2;
public subClass(T1 var1,T2 var2) {
super(var1);
this.var2=var2;
} public T1 Show1() {
return super.Show1(); } public void show2(T2 var3) {
System.out.println(var3);
System.out.println(var2);
} }

  

 限制泛型可用类型

  可以在定义类型时,使用extends关键字指定这个类型必须继承某个类,或者实现某个接口 

package com.date;

public class Extends_InterfaceDemo {
public static void main(String[] args) {
GenericClass<Dog> dogclass=new GenericClass<Dog>();
dogclass.setObj(new Dog());
dogclass.getObj().eat();
GenericClass<Cat> catclass=new GenericClass<Cat>();
catclass.setObj(new Cat());
catclass.getObj().eat(); }
} //只能接受Animal类型或者Animal类的子类类型
class GenericClass<T extends Animal>{
private T obj; public T getObj() {
return obj;
} public void setObj(T obj) {
this.obj = obj;
} } abstract class Animal{
public abstract void eat();
} class Dog extends Animal{ @Override
public void eat() {
System.out.println("狗啃骨头"); } } class Cat extends Animal{ @Override
public void eat() {
System.out.println("猫吃鱼"); } }

类型通配声明

泛型通配的方式

"?"代表任意一个类型

 

泛型方法

访问修饰符 <泛型列表> 返回类型 方法名(参数列表){
实现代码
}  

什么时候用到泛型方法,而不是泛型类呢?

添加类型约束只作用于一个方法的多个参数之间,而不涉及到类中的其他方法

public class Extends_InterfaceDemo {
public static void main(String[] args) {
GenericClass gen=new GenericClass();
gen.println("ABC");
gen.println(true);
gen.println(10);
gen.println(10.8);
gen.println(new Dog());
GenericClass.print("haha");
}
} class GenericClass{
//泛型方法
public<T> void println(T content) {
System.out.println(content);
}
//泛型方法的重载
public<T extends Animal> void println(T animal) {
animal.eat();
} public static <T> void print(T content) {
System.out.println(content);
}
}

 

案例讲解

自定义一个存放指定数据的容器

 

package com.day1;

import java.util.Arrays;

public class ArrayListDemo {
public static void main(String[] args) {
IContainer<String> list=new Container<String>();
for (int i = 0; i < 12; i++) {
list.add("data:"+(i+1));
} for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
} interface IContainer<T>{
public void add(T obj);//给容器添加数据
public T get(int index);//根据下标 获取指定位置的元素内容
public int size();//返回容器中元素的个数 } class Container<T> implements IContainer<T>{
// private T[] data=new T[10];//错误,不能参加泛型数组,无法知道数据类型
private Object [] data=null;
private int size=0;//记录容器元素的个数
public Container() {
data=new Object[10];//初始大小为10
}
public Container(int capacity) {
data=new Object[capacity];//
} @Override
public void add(T obj) {
//判断元素的个数是否超过容器的大小,超过了对容器进行扩容
ensureCapacity(size+1);
data[size++]=obj;//添加元素 } private void ensureCapacity(int i) {
if(i>data.length) {
int oldi=data.length;
int newi=oldi+(oldi>>1);//扩容为原有容量的1.5倍
data=Arrays.copyOf(data, newi);//将原有数组中的数据拷贝到新创建的数组中
} }
@Override
public T get(int index) { return (T)data[index];
} @Override
public int size() { return size;
} }

 @SuppressWarnings("unchecked")   去掉黄色警告

JAVA高级--java泛型的更多相关文章

  1. 从一知半解到揭晓Java高级语法—泛型

    目录 前言 探讨 泛型解决了什么问题? 扩展 引入泛型 什么是泛型? 泛型类 泛型接口 泛型方法 类型擦除 擦除的问题 边界 通配符 上界通配符 下界通配符 通配符和向上转型 泛型约束 实践总结 泛型 ...

  2. java高级---->Java动态代理的原理

    Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程 ...

  3. java高级---->Java观察者的原理

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己.今天我们通过模拟按钮的处理事件来深入Java ...

  4. java高级 - java利用listener实现回调,即观察者模式

    https://blog.csdn.net/lin_sir6/article/details/70052954

  5. 黑马程序员:Java基础总结----泛型(高级)

    黑马程序员:Java基础总结 泛型(高级)   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...

  6. JAVA 高级特性枚举和泛型

    枚举: 语法:  public enum 枚举名 { 枚举值表(罗列所有值) }  例如:  public enum EnumTest{MON,TUE,WED.THU,FRI,SAT,SUN} 枚举操 ...

  7. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  8. paip.java 架构师之路以及java高级技术

    paip.java 架构师之路以及java高级技术 1.    Annotation 设计模式... 概念满天飞.ORM,IOC,AOP. Validator lambda4j memcache. 对 ...

  9. Java高级之类结构的认识

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Java体系包括,各种版本的虚拟机,可执行文件,各种第三方类库,Java API类库,Java语言 ...

随机推荐

  1. [Day2] Nginx静态文件

    ​上一节我们介绍了nginx的三个使用场景和一些配置语法参数,今天我们就用一章的内容来介绍一下Nginx作为静态资源服务器的配置和常见问题. 一. 简单的静态服务器 ​话不多说,直接上配置代码. se ...

  2. MapReduce:详解Shuffle(copy,sort,merge)过程(转)

    Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解MapReduce, Shuffle是必须要了解的.我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑, ...

  3. Tensorflow技巧

    1.尽量控制图片大小在1024以内,不然显存会爆炸. 2.尽量使用多GPU并行工作,训练下降速度快. 3.当需要被检测的单张图片里物体太多时,记得修改Region_proposals的个数 4.测试的 ...

  4. PowerDesigner在修改表的字段Name的时Code不自动跟着变的处理方法以及导入Mysql数据库的表

    tools-> GeneralOptions-> Dialog:Operation   Modes: 去掉 NameToCodeMirroring 前面的√ 导入数据库中的表到PowerD ...

  5. AGC035D

    AGC035D Add and Remove 题意 给出\(n\)个数,每次删除一个不在两端的数,然后把它的权值加到相邻的两个数上. 问操作\(n-2\)次后,所剩的两数之和的最小值 \(n\le18 ...

  6. [转]js的垃圾回收机制

    javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存.在编写javascript程序时,开发人员不用再关心内存使用问题,所需内存的分配以及无用内存的回收完全实现了自动管 ...

  7. 读书笔记--iBATIS in Action 目录

    1.iBATIS的理念 2.iBATIS是什么 3.安装和配置iBATIS 4.使用以映射语句 5.执行非查询语句 6.使用高级查询技术 7.事务 8.使用动态SQL 9.使用高速缓存提高性能 10. ...

  8. Codeforces 220B

    B. Little Elephant and Array time limit per test 4 seconds memory limit per test 256 megabytes input ...

  9. OPGL+GLFW+GLEW配置详细步骤

    转载自:https://blog.csdn.net/weixin_40921421/article/details/80211813 本文设计的工具包: 链接:https://pan.baidu.co ...

  10. angular 项目迭代+记录采坑

    年中的时候 正在做的项目来了新的领导 给我们的NG4项目来了一次大整顿. 我们公司项目基本都是敏捷开发--> 开发出一个成熟的shared目录(里面有所有的公用组件 公用服务 公用工具类) 然后 ...