当前位置: 首页 > 面试题库 >

Java泛型超级关键字

陈法
2023-03-14
问题内容

但是,我似乎仍然对super关键字感到迷茫:

当我们声明这样的集合时:

List<? super Number> list = null;
list.add(new Integer(0));//this compiles
list.add(new Object());//this doesn't compile

不应该相反吗?我们有一个列表,其中包含一些对象(类型未知),它们是的父对象Number。因此Object应该适合(因为它是的父项Number),Integer而不应该。由于某种原因,情况恰恰相反。

只要我们有以下代码

static void test(List<? super Number> param) {
    param.add(new Integer(2));
}
public static void main(String[] args) {
    ArrayList<String> sList = new ArrayList<String>();
    test(sList);            //will never compile, however...
}

编译上面的代码是不可能的(我的理智建议这是正确的行为),但是基本逻辑可以证明是相反的:

String is Object, Object is superclass of Number. So String should work.

我知道这很疯狂,但这不是他们不允许使用<S super T>结构的原因吗?如果是,那为什么<? super T>允许?

有人可以帮助我恢复此逻辑链的缺失部分吗?


问题答案:

中的有界通配符List<? super Number>可以捕获Number及其任何超类型。由于Number extends Object implements Serializable,这意味着当前唯一可被捕获转换的类型List<? super Number>是:

  • List
  • List
  • List

请注意,你可以add(Integer.valueOf(0))使用上述任何一种。但是,你不能 add(new Object())使用List<Number>List<Serializable>,因为这违反了通用类型安全规则。

因此,它是不是真的,你可以add任意超NumberList<? super Number>; 根本不是有限的通配符和捕获转换如何工作。你不声明aList<? super Number>因为你可能想向其中添加一个Object(你不能!);之所以这样做,是因为你要向其中添加Number对象(即,它是的“消费者” Number),而仅仅是a List<Number>的限制太大。



 类似资料:
  • 问题内容: 当我以为自己终于了解了泛型时,我遇到了以下示例: 它说,如果第1行未注释,则不会编译以下内容: 如果注释了第2行,则不会编译以下内容: 在第二个示例中,允许使用脂肪族及其超类型。那么为什么不允许脂肪族? 在第一个示例中,为什么不允许? 第一个编译器错误: 第二编译器错误: 问题答案: 您的第一个声明 表示 可能 是一个(因为extends ,extends 和extended )。 在

  • 问题内容: 为什么我只能使用通配符而不使用类型参数? 例如,在界面中,为什么方法不是这样写的 问题答案: super绑定命名类型参数(例如)而不是通配符(例如)是非法的,这仅仅是因为即使允许,它也不会执行你希望的操作,因为既然这是所有引用类型的最终值,一切是,实际上有没有约束。 在你的特定示例中,由于任何引用类型的数组都是(通过Java数组协方差),因此可以在编译时用作(如果这样的绑定是合法的)自

  • 我一直在尝试练习一些java MCQ,但没能得到这一个,谁能解释一下输出是怎样的- 而不是

  • 本文向大家介绍JavaScript中的超级关键字?,包括了JavaScript中的超级关键字?的使用技巧和注意事项,需要的朋友参考一下 超 该超级 关键字用于访问和调用函数对对象的父。在类和对象文字中的任何方法定义中,super.prop和super [expr]表达式均清晰可见。它在“ extended ”类中使用,该类使用“ extends ”关键字。 语法 示例 在以下示例中,名为“人”的类

  • 我在Spring 4.0(使用Spring Boot)环境中遇到以下情况: 映射界面: 映射实现: 服务: 我想做这样一个抽象的超类服务: 所以我可以有如下实现: 但是Spring告诉我它找不到EntityModelMapper的合格bean来注入服务类。这种情况是可能的,我做错了什么,还是我在挑战Spring依赖注入的极限? 堆栈跟踪:

  • 问题内容: 如果我有一个使用通用类型的类,例如 如果我知道使用的所有类型(例如本例中的情况),那么在设计时就可以直接键入所有内容: 如果从“我不知道类型”的“某处”获得对象列表会怎样?如何分配类型: 问题答案: Java泛型不是C ++模板。 Java泛型是编译时功能,而不是运行时功能。 这是Java泛型教程的链接。 这永远无法与Java一起使用: 您必须使用多态(例如,每个对象都实现一个已知的接