首页
学习
活动
专区
圈层
工具
发布

Java 泛型〈? extends T 〉和 〈? super T 〉

使用泛型的过程中,经常出现一种很别扭的情况。 比如我们有Fruit类,和它的派生类Apple ?...然后有一个最简单的容器:Plate类 盘子里可以放一个泛型的”东西” 我们可以对这个东西做最简单的“放”和“取”的动作:set( )和get( )方法。 ?...为了让泛型用起来更舒服,Sun的大师们就想出了T>和T>的办法,来让”水果盘子“和”苹果盘子“之间发生正当关系。...四、上下界通配符的副作用 边界让Java不同泛型之间的转换更容易了。但不要忘记,这样的转换也有一定的副作用。那就是容器的部分功能可能失效。 还是以刚才的Plate为例。...>和类型参数T>的区别就在于,对编译器来说所有的T都代表同一种类型。 比如下面这个泛型方法里,三个T都指代同一个类型,要么都是String,要么都是Integer... ? 但通配符<?

1.4K10

泛型 T

1、什么是泛型 Java泛型(generics)是JDK5中引入的一个新特性。 本质就是万能类型。我们定义引用类型的变量需要指定其是什么Class的,使用泛型就可以代替其Class的作用!...public FanXingClass(T t) { this.t = t; } } 使用泛型类 String s = "Hello!"...子类是泛型类的话,子类和父类的泛型类型要一致 4、泛型接口 /** * 泛型接口 * @param T> */ public interface GeneratorT> { T getKey...(); } /** * 泛型接口的实现类,是一个泛型类, * 那么要保证实现接口的泛型类泛型标识包含泛型接口的泛型标识 * @param T> * @param */ public...只记录重点内容,与常见的泛型使用场景 泛型擦除 编译期的泛型T,在JVM的字节码转换为对应的类型,大部分没声明的都会被被转换为Object!

38910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Java 泛型】泛型用法 ( 泛型编译期擦除 | 上界通配符 <? extends T> | 下界通配符 <? super T> )

    文章目录 一、泛型擦除 二、泛型的上界通配符 T> 三、泛型的下界通配符 T> 一、泛型擦除 ---- 泛型只保留到 编译期 , 在 编译完毕后 , 泛型就不存在了 ; 在运行时 , 通过反射 , 调用泛型类 , 即使违反了泛型规则 , 也能进行相关操作 , 这是因为..., 泛型是 JDK 5 加入的 , 如果添加了泛型 , 导致字节码的格式改变 , 必然导致之前版本的 JDK 无法运行有泛型的字节码程序 ; 给定一个 Demo.java 类 , 其中定义了一个 T...extends T> 泛型类型 只能是 T 的子类 ; T extends Person> 只能在声明泛型时使用 , 不能在 使用 泛型 时使用 ; public class DataT extends...super T> ---- 泛型 下界通配符 : T> 泛型类型 只能是 T 的父类 ; <?

    1.5K10

    Java中的Object、T(泛型)、?区别

    因为最近重新看了泛型,又看了些反射,导致我对Object、T(以下代指泛型)、?产生了疑惑。...《Thinking in Java》中说很多原因促成了泛型的出现,最引人注目的一个原因就是为了创造容器类。这个要怎么来理解呢?...我的理解是,可以抛开这个为了创造容器类这个,而是回到泛型的目的是限定某种类型上来。...(之所以要强调在写代码时是因为泛型在虚拟机中会被JVM擦除掉它的具体类型信息,这点可参考泛型,在这里不做引申)。 比如在jdk中的List类是个泛型类。...这点给我们带来的启示是,在编写类似List类的时候,一定要注意是否用泛型。一定要多写几个泛型类,多讨论多理解,不然还是可能会搅在一起。 接着是?

    2.5K100

    泛型(泛型擦除)【java基础—-泛型】

    4.3不能实例化泛型,例如 T t = new T(); 理由:泛型擦除T都没了 4.4泛型不能是基本类型(泛型本质是一种引用类型),还有考虑到泛型擦除后的类型,例如为Object类型时,Object...不能存储基本类型int,double… 5.泛型擦除 5.1 泛型擦除概念: 5.2 由于泛型擦除出现的错误举例: ---- ---- 1.什么是泛型 1.1泛型概念: Java泛型是J2 SE1.5...: java.lang.Integer cannot be cast to java.lang.Double at MyGenerics.MyGenericTest.main(MyGenericTest.java...17 18 package MyGenerics; import java.util.List; //Generic类,泛型类 //语法:类名T> public class MyGeneric...4.使用泛型注意点: 4.1不同泛型之间不能相互赋值,泛型不存在多态((检查机制)泛型特点(3)) 4.2要注意泛型擦除 4.3不能实例化泛型,例如 T t = new T(); 理由:泛型擦除T都没了

    4.4K51

    java泛型之泛型边界

    参考链接: Java中具有泛型的有界类型 在网上发现这篇文章写得不错,地址:http://build.cthuwork.com:8081/wordpress/category/java教程/java再谈泛型.../   首先本文假定读者对Java的泛型有基础的了解,若需要请参考其他资料配合阅读。   ...其主要用处之一是在使用Java或第三方的API的泛型类时,对泛参类型不同,但泛参具有继承关系,且主要关注其输入的泛型对象进行归纳。...泛型也叫参数化类型,顾名思义,通过给类型赋予一定的泛型参数,来达到提高代码复用度和减少复杂性的目的。   在Java中,泛型是作为语法糖出现的。...在虚拟机看来,List这个泛型类型只是普通的类型List而已,这种行为叫泛型擦除(Type Erasure)。   那么在Java中泛型是如何如何实现其目的的呢?Java的泛型充分利用了多态性。

    2.8K10

    【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )

    (); 二、泛型方法用法 ---- 泛型方法 : 给下面的泛型方法 , 传入 String 作为参数 , 则 泛型方法中的 T 的类型就是 String 类型 ; public T, A> T...getData2(T arg){ T data = arg; return data; } 指定泛型的方法 : 指定 泛型方法 的泛型类 , 泛型方法 的泛型声明..., 隐含将泛型 T 设置为 String 类型 ; // 泛型方法 中 也可以不声明泛型类型 // 传入的参数是 泛型 T 类型 //..., 使用逗号隔开 * * 泛型方法指定的泛型 T 与类中的泛型 T 没有任何关系 * 这两个 T 可以是不同的类型 * * 泛型方法中定义的泛型...data; } } 2、main 函数 import java.util.ArrayList; import java.util.List; public class Main {

    12K30

    Java 泛型 T,E,K,V,?,傻傻分不清?

    前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。...泛型中通配符 我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V 等等,这些通配符又都是什么意思呢? 常用的 T,E,K,V,?...car = operate(); 简单总结下: T 是一个 确定的 类型,通常用于泛型类和泛型方法的定义,?是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法。...区别1:通过 T 来 确保 泛型参数的一致性 // 通过 T 来 确保 泛型参数的一致性 public T extends Number> void test(ListT> dest, ListT...> clazz; // 不会报错 public ClassT> clazzT; 小结 本文零碎整理了下 JAVA 泛型中的一些点,不是很全,仅供参考。

    66540

    java泛型中的通配符 T,E,K,V,?

    java泛型 java泛型(generics)是jdk5引入的新特性,泛型提供了编译时类型安全检测机制,该机制运行开发者在编译时检测到非法的类型....泛型的本质是参数化类型,也就是说,将所操作的数据类型作为一个参数传递,通过这个类型参数,就能识别这个变量的类型 public class TestGenericT> { private T...t; public void setT(T t) {this.t = t;} public T getT() {return t;} public static void main...testGeneric.setT("test"); //可以直接打印getT(),默认为String System.out.println(testGeneric.getT()); } } 泛型中的通配符...K和V 表示key,value,比如用于map的通配符 T(type) 表示具体的一个java类型 E (element) 表示一个元素,例如List 除了这几个特定意义的通配符之外,还存在 ?

    1.1K10

    java泛型通配符 ? extends T 和 ? super T 的区别和用法

    https://www.cnblogs.com/chyu/p/4630798.html 关于Java泛型,这里我不想总结它是什么,这个百度一下一大堆解释,各种java的书籍中也有明确的定义,只要稍微看一下就能很快清楚....从泛型的英文名字Generic type也能看出,Generic普通、一般、通用的,是一个概括性的词,那么泛型从名字上也就好理解了,它是一种通用类型,是java中各种类型的概括. ?...是java泛型中的通配符,它代表java中的某一个类,那么就代表类型T的某个子类,就代表类型T的某个父类....因为对于有上限T,故我们如果list.get(0)一定返回的是T或是T的子类,这个是确定的,得出: ListT的某个父类,将子类T赋值给父类没任何问题: List<?

    1.4K20

    Java 泛型 T,E,K,V,?,傻傻分不清?

    189篇原创内容 公众号 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。...泛型中通配符 我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V 等等,这些通配符又都是什么意思呢? 常用的 T,E,K,V,?...car = operate();   简单总结下: T 是一个 确定的 类型,通常用于泛型类和泛型方法的定义,?是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法。...区别1:通过 T 来 确保 泛型参数的一致性 // 通过 T 来 确保 泛型参数的一致性   public T extends Number> void   test(ListT> dest, List...> clazz;       // 不会报错       public ClassT> clazzT;   小结 本文零碎整理了下 JAVA 泛型中的一些点,不是很全,仅供参考。

    53210

    Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符

    泛型类的构造器写法: 不同泛型的引用类型不可以互相赋值 泛型如果不指定,就会被擦除,例子就是 泛型类中的静态方法不能使用类的泛型 不能直接使用泛型数组的创建,如果非要创建 泛型方法 什么是泛型方法...,不是带泛型的方法就是泛型方法,泛型方法有要求:这个方法的泛型参数类型要和当前类的泛型方法的泛型无关 换个角度:泛型方法对应的那个泛型参数类型和当前所在的这个类,是否为泛型类,泛型是啥,无关 泛型方法定义的时候...,前面要加上t,原因如果不加的话,会把t当作一种数据类型,然而代码中没有t类型那么就会报错 t的类型实在调用方法的时候确定的 泛型方法是否是静态方法?...可以是 代码类型: public class test02 { public void a(e e){ } public static T> void b(T t)...new test02(); t2.a("1"); t2.b("abc"); } } 泛型参数存在继承的情况 前面两个引用类型,都可以赋值,为什么list不行?

    4.8K10

    Java 泛型中 “T,E,K,V,?” 如何区分?

    Java 泛型中 “T,E,K,V,?” 如何区分?...Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。...泛型中通配符 我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V 等等,这些通配符又都是什么意思呢? 常用的 T,E,K,V,?...car = operate(); 简单总结下: T 是一个 确定的 类型,通常用于泛型类和泛型方法的定义,?是一个 不确定 的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法。...区别1:通过 T 来 确保 泛型参数的一致性 // 通过 T 来 确保 泛型参数的一致性 public T extends Number> void test(ListT> dest, ListT

    50410

    【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )

    ; java 泛型 与 C++ 模板 : Java 中的泛型 , 是仿照 C++ 中的 模板 开发的 , 目的是让开发者可以写出 通用 , 灵活 的代码 ; 伪泛型 : Java 中的泛型 , 是 伪泛型..., Java 泛型开发好之后 , 在 编译阶段 就 将泛型相关的信息消除 了 , 不会泛型留到运行时 ; 泛型类型 : 泛型方法 : 方法有参数 , 方法的参数 可以指定成一些 泛型 ; 泛型类 :...泛型的作用 : 安全检查 : 在 编译阶段 , 就可以进行 代码检查 , 将更少的错误带到运行时 ; 避免强转 : 避免 类型的强转 导致不必要的安全问题 ; 提高性能 : 使用泛型可以 提高 Java...2 个泛型 , 泛型的个数可以有很多个 , 多个泛型之间 , 使用逗号隔开 ; 泛型方法 与 泛型类 中的泛型 : 泛型不同 : 泛型方法指定的泛型 T 与 类中的泛型 T 没有任何关系 , 这两个...T 可以是不同的类型 ; 泛型相同 : 泛型方法中定义的 泛型 T , 与 参数类型的 T , 返回值类型的 T , 方法内部的 T , 都是同一个类型 ; /** * 泛型类 * 该

    23K30

    Java泛型

    泛型技术对于Java开发来说十分重要,它可以帮助我们编写出型质和安全的代码。但和C++不同,Java采用了类型擦除机制实现泛型,这给开发带来一定困惑。...本文将带你深入解读Java泛型与类型擦除,揭开这背后的奥妙之处。...Java泛型定义在Java中,泛型是通过在类、接口或方法前添加类型参数来实现的,比如:public class BoxT> { // T stands for "Type" private T t...类型擦除机制然而,与C++不同的是,Java在编译期会将类型参数替换为最接近的非泛型类型,叫做类型擦除。...类型擦除的优点加载时间与内存占用更低泛型类能向后兼容非泛型环境泛型方法能重载非泛型方法泛型类保持与原有类的二进制兼容性通过类型擦除,Java中泛型的设计既保证了向下兼容,又在编译期实现了类型检查,在安全与效率上取得很好的平衡

    52710

    Java 泛型

    例如类的声明一般用E,泛型方法一般用T。 1)泛型类、泛型接口 2)泛型方法: 传入的参数 | 参数返回值,是泛型 泛型与子类型 规则要自洽,提出反例打破漏洞。...您可以(几乎)将其视为源到源的转换,从而将代码的泛型版本转换为非泛型版本。 因此,即使存在未经检查的警告,Java虚拟机的类型安全性和完整性永远不会受到威胁。...Java语言中引入泛型是一个较大的功能增强不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了,这带来了很多好处。...泛型的一个主要目标就是提高Java程序的类型安全,使用泛型可以使编译器知道变量的类型限制,进而可以在更高程度上验证类型假设。...支持泛型的Java编译器(例如JDK1.5中的Javac)可以用来编译经过泛型扩充的Java程序(Generics Java程序),但是现有的没有使用泛型扩充的Java程序仍然可以用这些编译器来编译。

    2.7K51
    领券