【问题标题】:Why super keyword in generics is not allowed at class level为什么在类级别不允许泛型中的超级关键字
【发布时间】:2016-09-21 12:43:33
【问题描述】:

在泛型中

class A<T extends Number> 是允许的

但是

class A<T super Integer> 不允许

我不明白这一点。这可能听起来像新手问题,但我被困在其中

【问题讨论】:

标签: java generics inheritance polymorphism


【解决方案1】:

引用Java Generics: extends, super and wildcards explained:

类定义中不允许超界。

//this code does not compile !
class Forbidden<X super Vehicle> { }

为什么?因为这样的构造没有意义。例如,您不能用 Vehicle 擦除类型参数,因为 Forbidden 类可以用 Object 实例化。因此,无论如何您都必须将类型参数擦除到 Object 。如果考虑 Forbidden 类,它可以用任何值代替 X,而不仅仅是 Vehicle 的超类。使用 super bound 是没有意义的,它不会给我们任何东西。所以是不允许的。

【讨论】:

  • 我知道我对此发表评论已经很晚了。请清除我的这个查询:“你不能用 Vehicle 擦除类型参数,因为 Forbidden 类可以用 Object 实例化” 在“List”的情况下不是这样吗?这也应该被擦除为Object,为什么允许这样做?
  • 使用超级界限非常有意义,而您给出的报价非常具有误导性。我有一个扩展 HashMap (MyClass&lt;K super KeyType&gt; extends HashMap&lt;K, Object&gt;) 的类。如果这里允许super,我可以保证MyClass 可以存储带有KeyType 键的项目,因为底层HashMap 的键将始终是KeyType 的超级键。这里的想法不是X 被删除为Vehicle,这就是extends 的用途。我们希望X 擦除为高于(或等于)Vehicle 的值,以便我们类中X 类型的List 可以存储任何X 我们想把它放进去。
  • @Kröw 你能举个例子说明你可以用K 的实例做什么,因为知道它是KeyType 的一些超类型?
  • @AnkushGatfane 它擦除为Object&lt;T super Number&gt;&lt;? super Number&gt; 之间的区别在于,您实际上不能做任何有用的事情,因为它是“那种类型”:您所知道的关于 T 的所有信息就是它具有 @987654342 的所有方法@ 已。但是 all 引用类型具有 Object 具有的所有方法,因此除了添加任何该列表的Number 与列表中元素类型的预期兼容(即Number 是所需类型的子类)。
  • @AndyTurner 你说的是K 类型的对象,其中KKeyType 的超类型?我想我可以调用Object 中声明的任何方法,因为我知道它必须是Object。除此之外,您对 instance 无能为力,无需强制转换。另外,在我的第一条评论的最后一句话中,我的意思是,“......在我们的类中可以存储我们想要放入其中的任何Vehicle。”很抱歉,如果这造成任何混乱。
【解决方案2】:

考虑这个例子:-

案例 1 上限:

public class Node<T extends Comparable<T>> {
    private T data;
    private Node<T> next; 
}

在这种情况下,类型擦除将绑定参数T 替换为第一个绑定类Comparable

public class Node {
   private Comparable data;
   private Node next;
}

据我们所知,父类引用可用于引用子类对象。所以无论如何这段代码都是可以接受的,因为引用 data 可以指向任一实例Comparable 或其子类。

案例 2 下限:

如果我们可以有类似的代码

public class Node<T super Comparable<T>> {
    private T data;
    private Node<T> next; 
}

在这种情况下,Compiler 既不能使用Object 或任何其他类来替换此处的绑定类型T,也不可能使用子类引用来引用父类实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2010-10-04
    • 2013-10-01
    • 1970-01-01
    相关资源
    最近更新 更多