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

目录
相关文章
|
7月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
1640 0
|
7月前
|
安全 Java
Java之泛型使用教程
Java之泛型使用教程
441 10
|
12月前
|
自然语言处理 Java 关系型数据库
Java|小数据量场景的模糊搜索体验优化
在小数据量场景下,如何优化模糊搜索体验?本文分享一个简单实用的方案,虽然有点“土”,但效果还不错。
287 0
|
7月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
1163 1
|
9月前
|
安全 Java API
在Java中识别泛型信息
以上步骤和示例代码展示了怎样在Java中获取泛型类、泛型方法和泛型字段的类型参数信息。这些方法利用Java的反射API来绕过类型擦除的限制并访问运行时的类型信息。这对于在运行时进行类型安全的操作是很有帮助的,比如在创建类型安全的集合或者其他复杂数据结构时处理泛型。注意,过度使用反射可能会导致代码难以理解和维护,因此应该在确有必要时才使用反射来获取泛型信息。
296 11
|
9月前
|
存储 NoSQL Dubbo
Java主流分布式解决方案多场景设计与实战
本文介绍了Java领域的主流分布式技术,涵盖分布式服务框架(如Dubbo、Spring Cloud)、分布式数据存储(如Redis、MongoDB)、分布式锁(如ZooKeeper、Redisson)及分布式事务(如Seata、Hmily),并通过电商项目案例分析了这些技术在实际开发中的应用,帮助开发者应对高并发与大数据挑战。
420 0
|
9月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
363 0