类型的参数化

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

示例--泛型类

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. Life of Pi

    ·when you look into his eyes,you are seeing your own emotionsreflected back at you,nothing else. ·Go ...

  2. 【One by one系列】一步步部署.net core应用

    我们的目标: CentOS系统 nginx服务器 asp.net core应用 mysql服务器 腾讯云服务器 工具准备 [Xshell]--使用windwos下的工具Xshell,原理就是使用SHH ...

  3. 【One by one系列】一步步开始使用Redis吧(一)

    One by one,一步步开始使用Redis吧(一) 最近有需求需要使用redis,之前也是随便用用,从来也没有归纳总结,今天想睡觉,但是又睡不着,外面阳光不错,气温回升了,2019年6月1日,成都 ...

  4. docker启动单节点server模式的consul | Bitdoom

    原文:docker启动单节点server模式的consul | Bitdoom docker启动单节点server模式的consul 2017-09-07 环境:MacOSX, consul_0.9. ...

  5. Puppet基础应用

    Puppet简介 IT基础设施自动化管理工具,作者:Luck Kanies,官方站点:www.puppetlabs.com 管理设施的整个生命周期: provisioning.configuratio ...

  6. golang包引用

    一.我的GOPATH环境变量值如下图: 二.在GOPATH路径下面的的src目录下面的目录名称就是引用里面包的起始位置,如下图: 三.举例说明:这里引用同一个项目的包,源文件“learn/main/m ...

  7. php连接数据库查询方法(还少一种pdo方法)

    <?php header("content-type:text/html;charset=utf-8"); $conn = mysql_connect("local ...

  8. Chai.js断言库API中文文档

    基于chai.js官方API文档翻译.仅列出BDD风格的expect/should API.TDD风格的Assert API由于不打算使用,暂时不放,后续可能会更新. BDD expect和shoul ...

  9. kindle电子书下载网站收藏

    kindle推 http://readfree.me 鸠摩捜书 新浪爱问共享资料 我的小书屋 云海图书馆 书语者 36镇网站收藏夹

  10. laravel-admin 报错 Disk [admin] not configured, please add a disk config in `config/filesystems.php`.

    在config/filesystems.php中添加: 'disks' => [ 'local' => [        'driver' => 'local',        'r ...