首页 > 其他分享 >泛型

泛型

时间:2024-07-07 12:20:17浏览次数:8  
标签:String get 桥接 下限 泛型 public

泛型的本质就是泛型参数化,确保类型一致性和安全性

泛型上限与泛型下限

泛型上限和泛型下限都是用于限定参数范围的
1.泛型上限(上限指的是上限范围,读取的上限范围,)
通过extends关键字来限制参数上限,通过限制操作的顶层基类,来控制读取的类型,因为你读取的所有的对象,都是这个顶层基类的子类,确保读取安全

2.泛型下限(下限指的是下限范围,写入的下限范围)
通过super关键字来限制参数下限,通过限制操作的顶层类型,来控制写入的类型,因为你写入的所有对象,都是这个类型顶层基类的子类,确保了写入安全

纠正我自己一个奇怪思想,这个大概率是因为平时没写代码导致的,根深蒂固的思想错误,我一度认为这是对的,但是发现编译不过去F是符类,S是子类

点击查看代码
    public static void main(String[] args) throws Exception {
        /* 泛型下限 */
        List<? super S> list = new ArrayList<>();
        F f = new F();
        list.add(f);  //编译错误
    }

正确写法:明确存储的上限

点击查看代码
    public static void main(String[] args) throws Exception {
        /* 泛型下限 */
        List<? super F> list = new ArrayList<>();
        S s = new S();
        list.add(s);
    }

泛型中的桥接方法

前提:泛型中有泛型擦除的概念,泛型擦除是为了让泛型技术兼容JDK1.5之前的编译器,确保编译后没有泛型的总计,泛型会被具体的类型代理。

泛型桥接方法解决的问题:java中存在继承的关系,而桥接方法,解决了泛型擦除带来的多态性失效问题,下面举例子,假设我们存在如下泛型类以及子类

点击查看代码
class GenericClass<T> {
    public T get(T t) {
        return t;
    }
}

class StringClass extends GenericClass<String> {
    @Override
    public String get(String s) {
        return s;
    }
}

泛型擦除后编译的代码

点击查看代码
class GenericClass {
    public Object get(Object t) {
        return t;
    }
}


class StringClass extends GenericClass {
    public String get(String s) {
        return s;
    }

    // 桥接方法
    @Override
    public Object get(Object s) {
        return get((String) s);
    }
}

我们看到多了一个桥接方法,这个桥接方法是为了保证继承的有效性,很好理解,因为如果没有参数为Object的方法,就违背继承的概念了,桥接方法本身不包含任何逻辑,只做有效代码调用

标签:String,get,桥接,下限,泛型,public
From: https://www.cnblogs.com/lyzokok/p/18288246

相关文章

  • Java泛型
    Java泛型泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数据进行排序,我们就可以使用Java泛型。1......
  • 在构造方法里获取当前类的泛型
    定义publicclassMyClass<T>{privateClass<T>clazz;publicMyClass(){Typetype=this.getClass().getGenericSuperclass();if(typeinstanceofParameterizedTypeparameterizedType){if(parameterizedType.......
  • Golang面试:泛型
    Go语言在1.18版本中引入了泛型(Generics),这是Go语言发展中的一个重要里程碑。泛型允许你编写更通用和可复用的代码,而无需牺牲类型安全性。以下是对Go中泛型的详细介绍,包括其语法、使用场景和示例代码。1.泛型的基本概念泛型允许你定义可以处理多种数据类型的函数和数据结构,而无需......
  • 深入理解泛型(经典详解)
    深入理解泛型(经典详解):<T>T和T的使用以及public<E>List<E>get()泛型方法详解、类型擦除、通配符的使用、泛型类的应用、泛型之间的继承_泛型t-CSDN博客一、为什么要使用泛型?泛型俗称“标签”,使用<E>表示。泛型就是在允许定义类,接口时通过一个标识表示某个属性的类型或者......
  • 【测试文章搬运】创建泛型和测试套件
    创建泛型和测试套件泛型根据字面概念,通用词可以作为整个组或类的描述。在自动化应用程序时,我们会遇到各种端到端场景。端到端场景可能由几个简单的功能组成。因此,这些功能中的许多功能只需稍加修改或几乎无需修改即可作为多个测试脚本的通用功能。因此,建议创建一个通用类,其中......
  • 泛型对象
    泛型的使用是如果一个res接口数组结构,然后还有一个datas接口数组结构res={    code:number    msg:string    data:{}}res={    code:number      msg:string    data:{}}他们的......
  • 第13章:泛型
    第13章:随堂复习与企业真题(泛型)一、随堂复习1.泛型的理解,泛型参数,使用引用数据类型来赋值。2.泛型在集合、比较器中的使用(重点)集合:ArrayList、HashMap、Iterator比较器:Comparable、Comparator3.自定义泛型类/泛型接口、泛型方法(熟悉)classOrder{}public返回值......
  • 第一百一十节 Java面向对象设计 - Java泛型类
    Java面向对象设计-Java泛型类使用泛型,我们可以在不知道代码操作对象的类型的情况下编写代码。它允许我们创建泛型类,构造函数和方法。泛型类是使用形式类型参数定义的。形式类型参数是一个逗号分隔的变量名列表,位于类声明中类名后面的尖括号<>中。语法下面的代码声明一......
  • feign接口中使用泛型接收返回值
    问题一般在对接客户接口时,都会使用多个策略类处理,并且不同的客户返回值不同,因此比较好的方案是使用泛型来处理。然而现实是,feign或openfeign会擦除泛型,将返回的对象转为LinkedHashMap,导致转json反序列化成对象时异常。思路debug可以发现,在decode时,response返回的是所需......
  • Android面试题之Java 泛型和Kotlin泛型
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点定义:JDK5引入的一种参数化类型特性继承和实现接口可以多个staticclassA{}staticinterfaceB{}staticinterfaceC{}//类必须在接口的前面staticclassD<......