泛型深入--java泛型的继承和实现、泛型擦除

泛型实现类:

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){

    }
}

总结:

  1. 继承|实现

a) 保留:泛型子类

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

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

时间: 2024-10-22 13:21:49

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

JAVA问题之继承Comparable的泛型实例

因为看的是旧书,所以没学习过泛型的内容.导致编译器编写代码的时候老是提示需要对通用类型参数化.今天终于找到一个实例了: 1 package comparableclass.main; 2 3 import com.bruceeckel.util.*; 4 5 public class SCompType implements Comparable<SCompType> { 6 String s1,s2; 7 public SCompType(String s1i,String s2i){ 8

Java知多少(42)泛型通配符和类型参数的范围

本节先讲解如何限制类型参数的范围,再讲解通配符(?). 类型参数的范围 在泛型中,如果不对类型参数加以限制,它就可以接受任意的数据类型,只要它是被定义过的.但是,很多时候我们只需要一部分数据类型就够了,用户传递其他数据类型可能会引起错误.例如,编写一个泛型函数用于返回不同类型数组(Integer 数组.Double 数组等)中的最大值: 1 public <T> T getMax(T array[]){ 2 T max = null; 3 for(T element : array){ 4 m

Java知多少(41)泛型详解

我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值. 假如我们现在要定义一个类来表示坐标,要求坐标的数据类型可以是整数.小数和字符串,例如: 1 x = 10.y = 10 2 x = 12.88.y = 129.65 3 x = "东京180度".y = "北纬210度" 针对不同的数据类型,除了借助方法重载,还可以借助自动装箱和向上转型.我们知道,基本数据类型可以自动装箱,被转换成对应的包装类:Object 是所有

Java学习之道:简述泛型通配符&lt;? extends T&gt;和&lt;? super T&gt;

<? extends T>和<? super T>含有JAVA5.0的新的概念.由于它们的外表导致了很多人误解了它们的用途: 1.<? extends T>首先你很容易误解它为继承于T的所有类的集合,这是大错特错的,相信能看下去你一定见过或用过List<? extends T>吧?为什么我说理解成一个集合是错呢?如果理解成一个集合那为什么不用List<T>来表示?所以<? extends T>不是一个集合,而是T的某一种子类的意思,记

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

1. 泛型的简单运 用和意义 2. 泛型的上限与下限 3. 泛型和 子类继承的限制 4. 泛型类和泛型 方法 5. 泛型嵌套和泛型擦除 泛型(Generic) 什 么是泛型: ?java5开始出现的 一种对Java语 言类型的 一种拓 展,以 支持创建可以按类型进 行 参数化的类.可以把类型参数看作是使 用参数类型时指定的类型占位符,就好 比 方法的形式参数是实际参数的占位符 一样. ?泛型能保证 大型应 用程序的类型安全和良好的维护性;使 用泛型的优势: ?类型安全,使编译器 对泛型定义的类型

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

仿制药Java SE 1.5新功能.通用自然是参数化类型.即操作数据类型被指定为一个参数.这样的参数类型可以在课堂上使用.创建的接口和方法,他们被称为通用类..泛型方法. Java语言引入泛型的优点是安全简单. 规则和限制 1.泛型的类型參数仅仅能是类类型(包含自己定义类),不能是简单类型.2.同一种泛型能够相应多个版本号(由于參数类型是不确定的),不同版本号的泛型类实例是不兼容的.3.泛型的类型參数能够有多个.4.泛型的參数类型能够使用extends语句.比如<T extends superc

泛型及java中的泛型

当作笔记整理的~~~ 首先,引出堆对象这个概念. 什么是堆对象,就是程序在运行过程中可以随时建立或者删除的对象,可以用new运算符(或malloc函数)或者delete运算符(或free函数).泛型可以看作是一类堆对象. 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明. 各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型. 泛型的定义主要有两种:1.在程序编

Java泛型的其他应用——泛型接口、泛型方法、泛型数组以及泛型的嵌套设置

学习目标 掌握泛型接口的使用 掌握泛型方法的定义的及使用 掌握泛型数组的使用 掌握泛型的嵌套设置 之前所有的操作都是在类中直接使用泛型操作的,那么,对于Java来说,也可以直接在接口中定义及使用泛型. 定义泛型接口 在JDK1.5之后,不仅仅可以声明泛型类,也可以声明泛型接口,声明泛型接口和声明泛型类的语法类似,也是在接口名称后面加上<T>,如下格式所示: [访问权限]  interface 接口名称<泛型标识>{} interface Info<T>{ // 在接口上

java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨

//Sets.java package org.rui.generics.set; import java.util.HashSet; import java.util.Set; /** * 一个Set有用工具 * @author lenovo * */ public class Sets { public static<T> Set<T> union(Set<T> a,Set<T> b) { Set<T> result=new HashSet&

Android(java)学习笔记92:泛型高级之通配符

1 package cn.itcast_07; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 6 /* 7 * 泛型高级(通配符) 8 * ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了 9 * ? extends E:向下限定,E及其子类 10 * ? super E:向上限定,E极其父类 11 */ 12 public class GenericDemo { 13 public sta