泛型实现类:

package generic;
/**
* 泛型父类:子类为“富二代”:子类的泛型要比父类多
* 1,保留父类的泛型-->子类为泛型类
* 2,不保留父类泛型-->子类按需实现
*
*
* 子类【重写方法】的参数类型 -->随父类而定
* 子类新增的方法,参数类型随子类而定
* 子类中使用父类的【属性】 -->随父类而定
* 子类使用自己的属性-->随子类而定
* @author Administrator
*
*/
public abstract class Father<T1,T2> {
T1 age ;
public abstract void test(T2 name);
} //当继承Father类时,T1、T2的处理方式: //保留 -->父类保留,子类必须保留,所以子类是泛型子类
//1) 全部保留
class C1<T2,T1,A> extends Father<T1,T2>{ @Override
public void test(T2 name) {//子类重写方法的参数类型 -->随父类而定:T2
System.out.println("name : "+name);
} //子类自定义属性,类型随子类
A a ;
String str ;
/**
* 子类新增的方法,参数类型随子类而定
* @param a
*/
public void test2(A a){
System.out.println(a);
// this.a --> A类型,随子类
}
} //2) 部分保留
class C2<T2> extends Father<Integer,T2>{ @Override
public void test(T2 name) {//子类重写方法的参数类型 -->随父类而定:T2
this.age = 23; //Integer类型,子类使用父类的【属性】,类型随父类而定
}
} //不保留,把T1、T2替换成具体的类型
//---》按需实现:子类 可以扩展泛型
//1) 具体类型
class C3<A,B> extends Father<String,Integer>{ @Override
public void test(Integer name) {//子类重写方法的参数类型 -->随父类而定:Integer
this.age = "24";//String 类型,子类使用父类的【属性】,类型随父类而定
}
} //2) 没有类型 擦除 --》Object
class C4<A,B> extends Father{ @Override
public void test(Object name) {//子类重写方法的参数类型 -->随父类而定:Object
this.age = new Object();//Object 类型,子类使用父类的【属性】,类型随父类而定
}
}

泛型接口:

package generic;
/**
* 泛型接口:与泛型类 同理
* @author Administrator
*
* @param <T>
*/
public interface Comparator2<T> {
//全局常量
public static final int MAX_VALUE =100;
//公共抽象方法
public abstract void test(T t);
}
//实现
class InterC1<A> implements Comparator2{
@Override
public void test(Object t) {//类型是父类的
System.out.println(this.MAX_VALUE); //父类的
  }
}
class InterC2<Integer> implements Comparator2<Integer>{
@Override
public void test(Integer t) { //类型是父类的 }
} class InterC3<T,A> implements Comparator2<T>{
@Override
public void test(T t) {//类型是父类的 }
}

泛型擦除:

package generic;
/**
* 泛型的擦除:使用时 实现|继承 没有指定具体的类型
* 类似于Object 不等同于Object
* @author Administrator
*
*/
public class MyStuApp { public static void main(String[] args) {
//擦除:没有指定泛型的具体类型
//泛型擦除,但是存在警告
MyStudent student = new MyStudent();
student.setJavase(100); //int-->Object,以Object处理
Object javase = student.getJavase(); //2、消除警告 使用 Object
MyStudent<Object> student2 = new MyStudent<Object>(); //正确: 擦除,编译通过,不会类型检查
test(student); //编译失败:MyStudent<Object> 不等同于Object
//错误 ,Object 编译检查
//test(student2);
} public static void test(MyStudent<Integer> stu){ }
}

附MyStudent类:

package generic;
/**
* 自定义泛型类:
* 1,<> -->单个字母,尽可能见名知意
* 2,T Type
* K V Key Value
* E Element
* 3,注意泛型不能使用在静态属性上
*/
//T type ,类型
public class MyStudent<T> {
private T javase;
// private static T test;//静态编译错误 public MyStudent(){}
public MyStudent(T javase) {
super();
this.javase = javase;
} public T getJavase() {
return javase;
} public void setJavase(T javase) {
this.javase = javase;
}
}

总结:

  1. 继承|实现

a) 保留:泛型子类

b) 不保留:按需实现,可以泛型子类,也可以是非泛型子类。属性|方法 :随声明的位置而定。

  2.擦除:使用  继承|实现  没有指定类型,类似于Object

泛型深入--java泛型的继承和实现、泛型擦除的更多相关文章

  1. 深入理解泛型之JAVA泛型的继承和实现、泛型擦除

    很多的基础类设计会采用泛型模式,有些应用在使用的时候处于隔离考虑,会进行继承,此时子类如何继承泛型类就很讲究了,有些情况下需要类型擦除,有些情况下不需要类型擦除,但是大多数情况下,我们需要的是保留父类 ...

  2. 《徐徐道来话Java》(1):泛型的基本概念

    泛型是一种编程范式(Programming Paradigm),是为了效率和重用性产生的.由Alexander Stepanov(C++标准库主要设计师)和David Musser(伦斯勒理工学院CS ...

  3. 最佳新秀Java(22)——再次了解泛型

    仿制药Java SE 1.5新功能.通用自然是参数化类型.即操作数据类型被指定为一个参数.这样的参数类型可以在课堂上使用.创建的接口和方法,他们被称为通用类..泛型方法. Java语言引入泛型的优点是 ...

  4. 泛型(java菜鸟的课堂笔记)

                1. 泛型的简单运 用和意义   2. 泛型的上限与下限   3. 泛型和 子类继承的限制   4. 泛型类和泛型 方法   5. 泛型嵌套和泛型擦除             ...

  5. Java知多少(41)泛型详解

    我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值. 假如我们现在要定义一个类来表示坐标,要求坐标的数据类型可以是整数.小数和字符串,例如: x = 1 ...

  6. JAVA基础部分复习(三、泛型)

    JAVA泛型的基本使用: /** * JAVA泛型的使用 * 定义:泛型的本质是参数化类型,就是说所操作的数据类型被指定为一个参数. * * 定义泛型方法的规则 * 1.所有泛型方法声明都有一个类型参 ...

  7. Java基础01-集合1、泛型

    集合.泛型 第一章:集合1 1. 什么是集合 定义:在Java中,集合是一种可以存储多个数据的容器. 代码: ArrayList<String> list = new ArrayList& ...

  8. 夯实Java基础(十八)——泛型

    1.什么是泛型 泛型是Java1.5中出现的新特性,也是最重要的一个特性.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类. ...

  9. Java第十五天,泛型

    一.定义 泛型是一种未知的数据类型,即当我们不知道该使用哪种数据类型的时候,可以使用泛型. 泛型的本质是为了  参数化 类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型) ...

  10. Java 基础 一文搞懂泛型

    本文将从以下四个方面来系统的讲解一下泛型,基本上涵盖了泛型的主体内容. 什么是泛型? 为什么要使用泛型? 如何使用泛型? 泛型的特性 1. 什么是泛型? 泛型的英文是Generics,是指在定义方法. ...

随机推荐

  1. Can not find the tag library descriptor for "/struts-tags"`

    1.查看struts.xml路径是否错误,要放在src下, 2.缺少struts-tags.tld (1)查找方式: (2)找到此包,然后右键用解压缩文件打开. (3)然后你会看到很多的源码,找到红圈 ...

  2. PS各个工具的字母快捷键和英文全名

    选框-Marquee(M) 移动-move(V) 套索-Lasso(L) 魔棒-Wand(W) 喷枪-injection lance (J) 画笔-Brush (B) 铅笔-pencil(N) 橡皮图 ...

  3. python的特性

    python使用c语言开发 1.面向对象的特性 面向对象的程序设计抽象出对象的行为和属性,把行为和属性分离开,但是又合理的组织在一起.它消除了保护类型.抽象类.接口等面向对象的元素,使得面向对象的概念 ...

  4. [mysql] mysql如何实现更新一条记录中某个字段值的一部分呢?

    场景:在平常我们使用word文档等等office办公软件时,我们常会使用搜索->替换的功能. mysql: 在mysql 中有时候,我们也需要这样子的实现: 实现 SQL 语句: update ...

  5. delphi 安卓程序如何读取外部配置文件

    1)编辑一个config.txt文件,填写配置系统. 2)有外部加载文件时,安卓发布需要另行指定文件发布目录位置 比如加载config.txt需要在 首先利用Project->Deploymen ...

  6. 成员函数指针与高性能C++委托

    1 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值. ...

  7. Python学习-23.Python中的函数——isinstance

    在Python中可以使用isinstance函数来判断某个值或变量是否为某个类型. 例子: print(isinstance(1,int)) print(isinstance(1,float)) pr ...

  8. ASP.NET Core使用Elasticsearch记录NLog日志

    ASP.NET Core使用Elasticsearch记录NLog日志 1.新建一个 ASP.NET Core项目 2.安装Nuge包 运行:Install-Package NLog.Web.AspN ...

  9. vs2017使用rdlc

    写在前面:因为公司要求做个批量打印工具,以前用Delphi+FastReport开发的,现在因为公司就剩下一个Delphi开发工程师了,还外出,所以这是就落在我身上.因为这个打印工具不需要使用人员设计 ...

  10. T-SQL判断是否存在表、临时表

    利用SQL SERVER的系统函数 object_id() 可以判断是否存在表.临时表, object_id() 的作用是返回架构范围内对象的数据库对象标识.(即返回系统视图  sys.objects ...