2016 - 2024

感恩一路有你

张量的协变和逆变 c#泛型接口的协变和抗变是什么意思?

浏览量:2004 时间:2021-03-21 21:06:17 作者:admin

c#泛型接口的协变和抗变是什么意思?

“协变”与“逆变(抗变)”中的“协”与“逆”表示泛型接口在将类型参数仅用于输入或输出的情况下,其类型参数的隐式转换所遵循的规律。协变当泛型接口类型仅用于输出(使用关键词out),其类型参数隐式转换所遵循的规律与对象引用的类型转换规律相同,称之为“协变”逆变当泛型接口类型仅用于输入(使用关键词in),其类型参数隐式转换所遵循的规律与对象引用的类型转换规律相反,称之为“逆变”、“抗变”或“反变”。

Java为什么要有泛型?

java里的泛型是奇葩的存在。这也是我经常怼java的一个原因。

先说下泛型的主要作用:

1,强化类型安全,比如定义了一个List<String>,那么里面只能存放String,不允许存放其他类型(派生自String的除外)。类型安全应该在编译和运行时都能体现。

2,提高性能,减少类型转换和装箱拆箱次数。

再说下java泛型奇葩之处:

1,java泛型实现的原理叫类型擦除,不管代码中怎么定义泛型,编译后都变成object, 因此不能实现运行时的类型安全。 而且java编译器不够聪明,可以很容易骗过去。 举个例子,你调用了第三方的接口返回List<String>,但实际拿到的值里面可能跟String没有半毛钱关系。

2,既然类型被擦除,那么类型转换就不可避免了,因此使用泛型和非泛型在性能上没有任何变化。

java怎么获取一个泛型方法的真实泛型类型?

我认为,如果在方法内部获取还是可行的,但如果希望通过一个方法来获取一个泛型方法的真实泛型类型,那应该是实现不了。

首先Java中的泛型,也叫参数化类型,没记错泛型应该是jdk5引入的特性,泛型目的在于使数据类型可以作为参数传入,从而可以动态的改变某个变量的数据类型。

那么什么是泛型方法呢?就是泛型类型是声明在方法上,只有当调用该方法时才会将真实类型传入。如果你是在方法内部获取那直接调用泛型对象的getClass方法即可。但如果希望通过一方法来获取某个泛型方法的真实类型,我认为没法实现。因为未调用方法时,真实的数据类型还未入,所以根本无法取到泛型对应的真实类型。

所以下面我就说说如何在泛型方法内部获取泛型的真实类型。

老规矩,咱写段代码再来解释。泛型方法的例子如下图:

在上图中,我声明了一个泛型方法:findFirst, 用于获取数组的第一个元素。

运行结果如下图:

以上就是我的答案,希望对你有所帮助吧

Java为什么不能实现真正泛型?

一句话回答:Java一言九鼎!

Java在发布之初,就将二进制兼容这个承诺写入了《Java虚拟机规范》中,为了兼容Java1.5之前的版本最终选择了此方案。

虽然兼容的方案不止是擦除这一条路,但是这个承诺确实是导致其没有采用类似C#那种真泛型的方案的最重要的原因。

张量的协变和逆变 java泛型通配符 深入理解java泛型详解

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。