为什么我super
只能使用通配符而不使用类型参数?
例如,在Collection
界面中,为什么toArray
方法不是这样写的
interface Collection<T>{
<S super T> S[] toArray(S[] a);
}
super绑定命名类型参数(例如<S super T>
)而不是通配符(例如<? super T>
)是非法的,这仅仅是因为即使允许,它也不会执行你希望的操作,因为既然这Object
是super
所有引用类型的最终值,一切是Object
,实际上有没有约束。
在你的特定示例中,由于任何引用类型的数组都是Object[]
(通过Java数组协方差),因此可以<S super T> S[] toArray(S[] a)
在编译时用作(如果这样的绑定是合法的)自变量,并且不会ArrayStoreException
在运行时阻止- 时间。
你要提出的建议是:
List<Integer> integerList;
并鉴于此假设 super界限toArray:
<S super T> S[] toArray(S[] a) // hypothetical! currently illegal in Java
编译器只应允许以下内容进行编译:
integerList.toArray(new Integer[0]) // works fine!
integerList.toArray(new Number[0]) // works fine!
integerList.toArray(new Object[0]) // works fine!
并且没有其他数组类型参数(因为Integer只有这3种类型作为super)。也就是说,你正在尝试阻止此编译:
integerList.toArray(new String[0]) // trying to prevent this from compiling
因为,根据你的说法,String不是super的Integer。但是,Object是的a super和Integer,并且a String[]是an Object[],因此即使假设你可以做,编译器仍会让上述内容进行编译
!
因此,以下内容仍将进行编译(就像它们现在所采用的方式一样),并且ArrayStoreException在运行时无法通过使用泛型类型边界进行的任何编译时检查来阻止:
integerList.toArray(new String[0]) // compiles fine!
// throws ArrayStoreException at run-time
泛型和数组不会混合使用,这是它显示的众多地方之一。
一个非数组的例子
再说一次,假设你具有以下通用方法声明:
<T super Integer> void add(T number) // hypothetical! currently illegal in Java
并且你具有以下变量声明:
Integer anInteger
Number aNumber
Object anObject
String aString
你的意图
主要内容:super调用父类构造方法,super访问父类成员,super和this的区别由于子类不能继承父类的构造方法,因此,如果要调用父类的构造方法,可以使用 super 关键字。super 可以用来访问父类的构造方法、普通方法和属性。 super 关键字的功能: 在子类的构造方法中显式的调用父类构造方法 访问父类的成员方法和变量。 super调用父类构造方法 super 关键字可以在子类的构造方法中显式地调用父类的构造方法,基本格式如下: 其中,parameter-list 指定
我对java中的super关键字有一个问题。请遵循以下示例: 我的观点是,当我在子类中使用Super()时,java如何知道在我的子类中调用哪个构造函数?因为在我的超类中,我有两个没有参数的构造函数;公共双getRadius()和公共双getArea()
本文向大家介绍java 关键字super详解及用法,包括了java 关键字super详解及用法的使用技巧和注意事项,需要的朋友参考一下 java 关键字super详解 一、super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用
问题内容: 但是,我似乎仍然对super关键字感到迷茫: 当我们声明这样的集合时: 不应该相反吗?我们有一个列表,其中包含一些对象(类型未知),它们是的父对象Number。因此Object应该适合(因为它是的父项),而不应该。由于某种原因,情况恰恰相反。 只要我们有以下代码 编译上面的代码是不可能的(我的理智建议这是正确的行为),但是基本逻辑可以证明是相反的: 我知道这很疯狂,但这不是他们不允许使
本文向大家介绍super 关键字的理解相关面试题,主要包含被问及super 关键字的理解时的应答技巧和注意事项,需要的朋友参考一下 super 关键字 super关键字用于从子类访问父类的变量和方法。 例如: 在上面的例子中,Sub 类访问父类成员变量 number 并调用其其父类 Super 的 方法。 使用 this 和 super 要注意的问题: 在构造器中使用 调用父类中的其他构造方法时,
本文向大家介绍Java继承extends与super关键字详解,包括了Java继承extends与super关键字详解的使用技巧和注意事项,需要的朋友参考一下 函数也称为方法! 继承:在java中使用extends关键字来表示继承关系。super用来继承父类方法和参数。 继承就是子类继承父类的特征和行为,使得子类具有父类相同的行为。 注意事项: 1、当一个类没有继承任何一个类时,系统默认继承Obj