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

Java泛型-为什么允许“扩展T”但不允许“实现T”?

赏成益
2023-03-14
问题内容

我想知道Java中是否有特殊原因总是使用“ extends”而不是“ implements”来定义类型参数的界限。

例:

public interface C {}
public class A<B implements C>{} 

被禁止但是

public class A<B extends C>{} 

是正确的。是什么原因呢?


问题答案:

在类“实现”还是“扩展”之间,通用约束语言没有语义差异。约束可能性是“扩展”和“超级”-也就是说,该类是可分配给其他类的对象(扩展),还是该类可从该类分配(超级)。



 类似资料:
  • 问题内容: 作为实验,我尝试扩展-array,如下所示: 在类本身中添加一些与排序,交换,子数组构建等有关的方法。但是我在编译时遇到了这个错误: 我很好奇:为什么Java不允许扩展数组? 问题答案: 扩展基本类型(例如a 或数组)会打开安全漏洞。如果Java允许您扩展数组,则采用数组的方法将变得不安全。这就是字符串为,而数组根本不能扩展的原因。 例如,您可以重写该方法,并返回不正确大小的数组。这有

  • 问题内容: 为什么允许但发出警告? 类型参数T不应由最终类型String限制。最终类型无法进一步扩展 我知道最后的决定我知道这是有效的,因为我可能只想知道警告的值。 问题答案: 如果实际的问题是“为什么允许”,那么想象一下在现有类中添加关键字时的情况。我认为您不希望此更改破坏将此类用作通用范围的其他现有代码,因为它仍然完全合法。这就是为什么编译器在这种情况下不会发出错误的原因。 另一方面,如果您不

  • Java说: 所以说数组是协变的。但对于泛型,他们说: 因此它是不变量。但问题是,“泛型真的不变吗?”? 例如,如果我给出: 这意味着列表可以采用异常的子类型,例如这是有效的: 那么为什么泛型被称为不变量呢?

  • 下面的泛型代码无法编译,我可以理解原因:这是为了阻止可能不兼容的类型添加到集合中: 然而,我可以对数组做同样的事情,并且不会得到编译器错误。当我运行它时,我会得到一个 为什么编译器不阻止我上传数组,因为它会麻烦地阻止我上传泛型?

  • 在爪哇,its说: 所以数组被称为协变的。但对于泛型,他们说: 因此它是不变的。但问题是,“泛型真的是不变的吗”? 那为什么说泛型是不变的呢?

  • 问题内容: 我读了这个问题,并认为如果可以写的话,很容易解决(不是没有它就不能解决): 我不确定在很多情况下它是否有用,但是我想知道为什么它没有用,以及其他语言中是否存在类似的东西。 你们有什么感想? 编辑: 澄清一下:是的,我知道,这在Java中是不可能的,我也不是很想念它。这不是我期望的工作,并且惊讶于出现编译器错误。我只是有这个主意,喜欢讨论它。 问题答案: 它违反了封装。你不应该能够绕过父