首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Java基础知识:泛型类型擦除、逆

" 第一个 Signature #14 : 指向来常量池中 String 类型 ArrayList 记录了 toString 方法返回泛型信息。...(二) 对于挂载在函数返回类型泛型信息,可以通过如下方法来获取泛型信息: IntList.class.getDeclaredMethod("toStringList").getGenericReturnType...image.png 逆继承关系 image.png 因此 Number 类型 filter 过滤类可以认为是逆之后 Double 类型 Filter 类型。...通过逆,可以让泛型约束变得更加宽松。 与不同,逆放宽是对父类约束,而放宽是对子类约束。 但同样,逆放宽类型约束是存在一定代价: List<?...extends 通配符,使得子类型泛型对象可以进行赋值,但同样会失去调用 add 存储功能时传递该泛型对象能力: //泛型 List<?

65030

JAVA冷知识】什么是逆(contravariant)&(covariant)?数组支持&逆?泛型呢?

写在前面 ---- 和小伙伴分享一些java小知识点,主要围绕下面几点: 什么是逆(contravariant)&(covariant)? 数组支持&逆? 泛型支持&逆?...说明对于数组逆变来讲,是不支持,将父类强制转化为子类报类型转化异常,java并没有对这方面做限制。...对于和逆是否支持 泛型不支持不支持,即不能把一个父类对象赋值给一个子类类型变量,相反也是同理。...super Integer> li = new ArrayList(); 关于就和小伙伴分享到这里,嗯,还有方法,这里要简单说明下 方法: 即子类方法返回类型比父类方法要窄...//子类doStuff()方法返回类型比父类方法要窄,即该方法为方法,也称多态。

62510

C# 学习笔记(15)—— C# 4.0

我们知道,面向对象继承中就蕴含可变性,当方法声明返回类型为Stream时,可以在实现中返回一个FileStream类型,这里就存在一个隐式转换。...C# 2.0 确实是不支持,但因为有了这样需求,微软便适应地做出了改进,在 C# 4.0 中引入了泛型变性和逆变性 变性 变性指的是泛型类型参数可以从一个派生类隐式地转换为基类 C# 4.0...由于IComparer接口泛型参数只支持逆不支持,所以不能把IComparer类型隐式地转换为IComparer,所以会出现编译错误 和逆注意事项...并不是所有类型都支持泛型类型参数和逆变性,下面总结了使用这两个特性时需要注意地方 只有借口和委托才支持和逆(如Func、Action),类或泛型方法类型参数都不支持和逆...和逆只适用于引用类型,值类型不支持和逆(因为可变性存在引用转换过程,而值类型变量存储就是对象本身,并不是对象应用),所以List无法转换为IEnumerable<object

18520

TypeScript 相关问题(含解答)

length // ok 复制代码 什么是抗、双和逆? Covariant ,TS对象兼容性是,父类 <= 子类,是可以。子类 <= 父类,错误。...Bivariant 双向,函数参数类型默认是双向。父类 <= 子类,是可以。子类 <= 父类,是可以。...下面的代码在ts中是完全可以,但在java等基于名义语言则会抛错。...例如基本类型,联合类型类型别名不支持继承 类型别名不会创建一个真正名字 类型别名无法被实现(implements),而接口可以被派生类实现 类型别名重名时编译器会抛出错误,接口重名时会产生合并...比如一个函数总是抛出错误,而没有返回值。或者一个函数内部有死循环,永远不会有返回值。函数返回值就是never类型。 void, 没有显示返回函数返回值为void类型

1.1K20

钉钉前端面试题~TypeScript相关问题及解答

length // ok 复制代码 什么是抗、双和逆? Covariant ,TS对象兼容性是,父类 <= 子类,是可以。子类 <= 父类,错误。...Bivariant 双向,函数参数类型默认是双向。父类 <= 子类,是可以。子类 <= 父类,是可以。...下面的代码在ts中是完全可以,但在java等基于名义语言则会抛错。...例如基本类型,联合类型类型别名不支持继承 类型别名不会创建一个真正名字 类型别名无法被实现(implements),而接口可以被派生类实现 类型别名重名时编译器会抛出错误,接口重名时会产生合并...比如一个函数总是抛出错误,而没有返回值。或者一个函数内部有死循环,永远不会有返回值。函数返回值就是never类型。 void, 没有显示返回函数返回值为void类型

1K20

Java泛型与逆

泛型默认不支持 为了避免重蹈Java数组覆辙,Java泛型显然不能再继续支持默认。...总结来说,支持集合只能取出元素,不能添加元素——疯狂Java讲义归纳口诀是:只出不进!...对于更通用泛型来说,对于支持泛型,程序只能调用以泛型为返回类型方法;不能调用形参为泛型方法。例如如下代码。...extends Number>也是支持泛型,因此该类型变量只能调用返回值为泛型方法,不能调用形参为泛型方法——如上①号代码所示。...对于更通用泛型来说,对于支持逆泛型,程序只能调用以泛型为形参方法;不能调用形参为返回类型方法(除非将返回值当成Object处理)。例如如下代码。

1.2K40

深入类型系统_TypeScript笔记8

,具体如下: 变量或(类)成员初始值 参数默认值 函数返回值 这3类值都能提供直接类型信息,进而确定目标类型。...,简单地讲: (covariant):允许出现父类型地方,也允许出现子类型,即里氏替换原则 逆(contravariant):变反过来,即允许出现子类型地方,也允许出现父类型(bivariant...):同时满足协和逆 不变(invariant或nonvariant):既不满足协也不满足逆 很容易理解,子类型兼容父类型,此外还具有一些(父类型不具备)扩展属性或方法,因此用子类型换掉父类型后...,子类型允许类型之间有层级(继承)关系,从宽泛类型到特殊类型,而、逆等关系就建立在这种类型层级之上: :简单类型层级关系保留到了复杂类型,这个复杂类型就是,例如Animal是Cat类型...,而数组Animal[]也是Cat[]类型,所以数组类型:简单类型层级关系到复杂类型中反过来了,这个复杂类型就是逆

96340

Java从入门到精通九(Java泛型)

Java从入门到精通九(Java泛型) 泛型说明 使用泛型好处 泛型类 泛型接口 引入类型通配符 不变,,逆 用通配符支持和逆(开挂行为) 泛型方法 泛型方法与可变参数 泛型上界下界 泛型数组...这样转换虽然在编译没有报错,但是运行时候便会抛出异常。 Integer类型是无法转换为String类型。...引入类型通配符 这个我是查看了许多文章,然后其中说明一个比较好,我摘录一下具体内容。 不变,,逆 网上查看了许多资料就找到一篇用这几个名词。...简单来说,逆就是比如A是B父类,但是A可以继承B类型匹配。。这样其实看起来有点逆向关系,所以叫做逆,当然一般情况下,是不支持。...就是如果A是B父类,B可以继承A属性,也可以认为就是类型关系。 不变就是无论AB是和关系,都不能进行类型匹配。

64410

编程思想 之「多态、初始化顺序、返回类型

返回类型Java SE5 中,添加了返回类型,它表示在导出类中被覆盖方法可以返回基类方法返回类型某种导出类型。...对于上述返回类型定义,读起来有些让人吐血,简单点,通过下面的程序理解返回类型: package com.hit.chapter8; /** * author:Charies Gavin...如上图所示,展示了使用返回类型效果。...在 Java SE5 之前,强制导出类中被覆盖方法必须返回基类方法返回类型,但是在增加返回类型之后,我们可以让在导出类中被覆盖方法返回基类方法返回类型某种导出类型,也就是说可以返回更加具体返回类型...例如上例中kind()方法,在 Java SE5 之前,只能返回Plant,但是在使用返回类型之后,我们可以直接返回更加具体Peony类型

45620

编程思想 之「多态、初始化顺序、返回类型

返回类型Java SE5 中,添加了返回类型,它表示在导出类中被覆盖方法可以返回基类方法返回类型某种导出类型。...对于上述返回类型定义,读起来有些让人吐血,简单点,通过下面的程序理解返回类型: package com.hit.chapter8; /** * author:Charies Gavin...Luoyangred extends Flower { Peony kind() { return new Peony(); } } [002] 如上图所示,展示了使用返回类型效果...在 Java SE5 之前,强制导出类中被覆盖方法必须返回基类方法返回类型,但是在增加返回类型之后,我们可以让在导出类中被覆盖方法返回基类方法返回类型某种导出类型,也就是说可以返回更加具体返回类型...例如上例中kind()方法,在 Java SE5 之前,只能返回Plant,但是在使用返回类型之后,我们可以直接返回更加具体Peony类型

1.2K40

Java魔法堂:解读基于Type Erasure泛型

声明泛型变量,如 List lst = new ArrayList();      注意点——泛型不支持 // S为P子类,但List并不是List子类...,也就是不支持 // 因此下列语句无法通过编译 List lst = new ArrayList(); // 而数组支持 P[] array = new S[10];      ...泛型类类型参数可供实例方法、实例字段和构造函数中使用,不能用于类方法、类字段和静态代码块。... number){} // JDK6后可通过不同返回值类来解决冲突 // 对于Java语言而言,方法签名仅为方法名+参数列表,但对于Bytecodes而言方法签名还包含返回类型...,根据不同入参类型和对返回值进行类型转换组合将导致不同结果。

1.1K80

深入理解 Java 泛型

Java编译器类型转换和类型检查 类型自动转换 既然上面所说Java会在编译时对泛型进行擦除,那么它要实现同一份泛型代码不同类型通用必然需要类型转换,事实编译器也是这么干,比如下面的这一段代码:...,而泛型中是不支持,如上面的 List fruits=new ArrayList();//error 会产生编译时错误,之所以这么设计是因为数组支持运行时检查而集合类不支持运行时检查...不做任何限制,跟不用类型参数 List 有什么区别呢? List list 表示 list 是持有某种特定类型 List,但是不知道具体是哪种类型。那么我们可以向其中添加对象?...Kotlin 相比于Java 类型使用更为安全,泛型数组不支持Java中支持)避免了数组运行时可能导致类型转换异常,Kotlin中集合类和数组泛型是有特定关键字来达到“”和“逆效果...,Kotlin 中相对于 Java 通配符提出了一种新定义:声明处型(declaration-site variance)与类型投影(type projections) 这两种都是型,不过一个是在声明处

54620

你绝对想不到 Kotlin 泛型给反射留下了怎样坑!

坑亦有理 那我们就来分析下吧,报错原因也很简单,编译器说 this@description 类型是 Person,而 it.get 需要参数类型是 out Person,什么鬼,这里居然还有事儿...可问题是你老人家仔细瞅瞅,类型强转事儿,真是没听说过.. 这就有意思了,我明明用是 Person 实例,怎么后面的属性泛型参数是 out Person?...其实 Java 也有类似的操作,请看文章:Java中getClass方法返回类型 person::class 相当于 Java person.getClass(),尽管这个方法签名是这样:...> getClass() 但这个返回值实际: Class<?...当中)处理方式是一致返回值都是,但对于反射来说,Java 对参数类型要求几乎没有,而 Kotlin 则非常严格,这样会导致问题就是 Kotlin 反射使用起来有些难受。

8.2K21

关于 Java 你不知道十件事

更多详情请参考这篇文章,或者 Stack Overflow 这篇文章。 2. 可以使用不同返回类型来重载方法 以下代码是编译不过,对吧? ?...是的,Java 不允许在一个类中通过不同返回类型和异常语句来重载方法。...这样提高了 JVM 灵活性以实现各种语言特性。例如,可以用桥接方法(bridge method)来实现方法返回类型,桥接方法和被重载方法可以有相同函数签名和不同返回类型。...因此,修改 JVM 是实现这个特性最简单方法了(同时实现了式覆盖)。很聪明吧。 你明白语言内部特性了吗? 这里有更多细节。 3. 这些都是二维数组 ? 是的,这是真的。...你也不懂复合赋值运算符 很诡异?让我们来看以下两段代码: ? 直觉,他们是等价吧?

60210

Java魔法堂:解读基于Type Erasure泛型

声明泛型变量,如 List lst = new ArrayList();      注意点——泛型不支持 // S为P子类,但List并不是List子类...,也就是不支持 // 因此下列语句无法通过编译 List lst = new ArrayList(); // 而数组支持 P[] array = new S[10];      ...泛型类类型参数可供实例方法、实例字段和构造函数中使用,不能用于类方法、类字段和静态代码块。... number){} // JDK6后可通过不同返回值类来解决冲突 // 对于Java语言而言,方法签名仅为方法名+参数列表,但对于Bytecodes而言方法签名还包含返回类型...,根据不同入参类型和对返回值进行类型转换组合将导致不同结果。

99050

Java初学者30个常见问题

我想使用数组来表示一个包含泛型栈,但是以下代码编译报错。为什么? A. 不错尝试。不幸是,创建一个泛型数组在 Java 1.5里不支持。...你可以使用cast,比如下面的写法: 根本原因是JAVA数组是“(covariant)”,但是泛型并不是。...比如, String[] 是 Object[]一种子类型,但是 Stack并不是 Stack 一种子类型。 许多程序员认为“”数组是JAVA在数据类型方面的一个缺点。...但是,如果我们不考虑泛型,“”数组是有用,比如实现 Arrays.sort(Comparable[]) 方法,然后当参数是 String[]时它也可以被正常调用。 Q....它将返回一个运行时错误。基础类型不允许它对应装箱类型值是null。 Q. 为什么第一组打印是 true,但是后面两组打印是 false? A.

1.7K51
领券