Java泛型的继承场景

简介: Java泛型的继承场景

泛型用法

  1. 泛型类/接口:在类/接口后增加关键字"<泛型标识>",申明后该类/接口的具体方法可以使用此标识作为,入参/出参的类型。
  2. 泛型方法:在方法访问修饰符后增加关键字"<泛型标识>"。
泛型标识:可以是任意字符串,通常使用单个大写字母表示.
可以有多个泛型标识代表不同参数

泛型作用:

  1. 编译前编译工具检查
  2. 运行过程中自动转换类型

下面主要说明泛型在继承场景下的使用。

父类与接口

interface GenericityInterface<T> {
    String getString(T t);
}
abstract class GenericityClass<A extends Collection, B> {
    abstract String getString(A a, B b);
}
子类/实现类可使用@Override让编译工具检查是否重写了父类中方法,否则可能是重载了父类方法,
导致在使用父类/接口封装业务时出现偏差。

沿用所有泛型

class SubGenericity1<T, B, A extends Collection> extends GenericityClass<A, B> implements GenericityInterface<T> {
    @Override
    public String getString(T o) {
        return o.getClass().toString();
    }

    @Override
    String getString(A a, B o) {
        return o.getClass().toString() + "|" + o.getClass();
    }
}
  • GenericityInterface/GenericityClass 中泛型标识符可以使用任意字符,但个数不能大于实际个数。
  • SubGenericity1<T, B, A extends Collection>,表示当前类使用三个泛型标识符,T,B,A,标识需要和继承的类/接口保持一致

当父类泛型存在限制时子类的泛型需要小于或等于父类中泛型范围,例如父类范围是Collection,子类可以是List,但反过来不行。

合并泛型

class SubGenericity2<T extends Collection, B> extends GenericityClass<T, B> implements GenericityInterface<T> {
    @Override
    public String getString(T o) {
        return o.getClass().toString();
    }

    @Override
    String getString(T a, B o) {
        return o.getClass().toString() + "|" + o.getClass();
    }
}

class SubGenericity21<T extends Collection> extends GenericityClass<T, T> implements GenericityInterface<T> {
    @Override
    public String getString(T o) {
        return o.getClass().toString();
    }

    @Override
    String getString(T a, T o) {
        return o.getClass().toString() + "|" + o.getClass();
    }
}
  • GenericityClass<T, T>:从上述代码可知泛型申明类似与占位符,只要与父类个数相同即可,标识符一致表示是同一个泛型约束

不使用泛型

class SubGenericity3 extends GenericityClass implements GenericityInterface {
    @Override
    public String getString(Object o) {
        return o.getClass().toString();
    }

    @Override
    String getString(Collection collection, Object o) {
        return o.getClass().toString() + "|" + o.getClass();
    }
}
  • 继承时不写泛型则表示不继承父类/接口中泛型约束,覆盖方法时使用Object代替了泛型约束,类型擦除的一种体现

部分使用泛型

class SubGenericity4<T> extends GenericityClass implements GenericityInterface<T> {
    @Override
    public String getString(T o) {
        return o.getClass().toString();
    }

    @Override
    String getString(Collection collection, Object o) {
        return o.getClass().toString() + "|" + o.getClass();
    }
}
class SubGenericity5<T extends Collection,B> extends GenericityClass<T,B> implements GenericityInterface {
    @Override
    public String getString(Object o) {
        return o.getClass().toString();
    }

    @Override
    String getString(T collection, B o) {
        return o.getClass().toString() + "|" + o.getClass();
    }
}

继承时指定类型

class SubGenericity6 extends GenericityClass<List,String> implements GenericityInterface<Map> {
    @Override
    public String getString(Map o) {
        return o.getClass().toString();
    }

    @Override
    String getString(List collection,String o) {
        return o.getClass().toString() + "|" + o.getClass();
    }
}
  • 通常使用此模式使用泛型

其它-获取运行时类型

class Test<T>{
    public Class getActualClass(){
        ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
        return (Class) type.getActualTypeArguments()[0];
    }
}
在子类需要沿用泛型,且需要创建泛型对应对象时会使用此方法,
其中type.getActualTypeArguments()返回的是该类申明的所有泛型,可能存在多个。

参考资料

https://docs.oracle.com/javase/tutorial/java/generics/types.html

目录
相关文章
|
14天前
|
Java
Java中的继承和多态是什么?请举例说明。
Java中,继承让子类继承父类属性和方法,如`class Child extends Parent`,子类可重写父类方法。多态允许父类引用指向子类对象,如`Animal a = new Dog()`,调用`a.makeSound()`会根据实际对象类型动态绑定相应实现,增强了代码灵活性和可扩展性。
10 0
|
15天前
|
JavaScript Java 编译器
Java包装类和泛型的知识点详解
Java包装类和泛型的知识点的深度理解
|
21天前
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
15 3
|
1月前
|
Java
java中的泛型类型擦除
java中的泛型类型擦除
13 2
|
2天前
|
安全 Java
Java基础&面向对象&继承&抽象类
Java基础&面向对象&继承&抽象类
|
2天前
|
Java
【Java基础】详解面向对象特性(诸如继承、重载、重写等等)
【Java基础】详解面向对象特性(诸如继承、重载、重写等等)
7 0
|
2天前
|
存储 安全 Java
每日一道Java面试题:说一说Java中的泛型?
今天的每日一道Java面试题聊的是Java中的泛型,泛型在面试的时候偶尔会被提及,频率不是特别高,但在日后的开发工作中,却是是个高频词汇,因此,我们有必要去认真的学习它。
15 0
|
14天前
|
存储 监控 安全
泛型魔法:解码Java中的类型参数
泛型魔法:解码Java中的类型参数
34 0
泛型魔法:解码Java中的类型参数
|
16天前
|
Java API
Java基础—笔记—内部类、枚举、泛型篇
本文介绍了Java编程中的内部类、枚举和泛型概念。匿名内部类用于简化类的创建,常作为方法参数,其原理是生成一个隐含的子类。枚举用于表示有限的固定数量的值,常用于系统配置或switch语句中。泛型则用来在编译时增强类型安全性,接收特定数据类型,包括泛型类、泛型接口和泛型方法。
9 0
|
1月前
|
Java
java中的继承
java中的继承
10 1