我不明白为什么要Company
编译。我以为它检查了extends
但没有检查implements
?
public interface Employee
public class HourlyEmployee implements Employee
public class Company<T extends Employee>
Company<HourlyEmployee> company = new Company<>();
extends
泛型中的关键字在语义上与常规extends
关键字略有不同。
当使用extends
在泛型的上下文中,例如T extends Something
,这意味着,T
应该是一个类型的 任一
实现的接口Something
(在情况下,当Something
是接口), 或者
是子类Something
(如果Something
是一个类)。
可能的原因是,如果implements
Generics中支持该关键字,则会使类型参数声明过于冗长。
例如,您将拥有:
<T extends SomeClass implements Serializable & Observable>
相反,此方法的有效语法为:
<T extends SomeClass & Serializable & Observable>
implements
实际上,您不需要关键字。在定义类型的界限时T
,您只需要指出您的类型是从哪些 类型T
派生的,而不管它们是接口还是类。
类型定义不是类定义。您可以将类型定义视为联接了几个数据集,其中结果集就是您的type T
。
问题内容: 谁能告诉我第一和第二代码之间的区别是什么?MaxPQ代表优先级队列,它是可以相互比较的“关键”对象的集合。 代码1: 代码2: 第二个代码没有编译,但是对我来说不直观,为什么在使用泛型时为什么需要扩展而不是实现接口。 问题答案: 区别非常简单:第二个代码段不会编译,也永远不会编译。对于泛型,您始终对类和接口都使用。也可以在此处使用关键字,但是它具有不同的语义。
问题内容: 为了减少类的依赖性,我想将参数(使用泛型类)发送到扩展某些类并实现接口的构造函数,例如 可能吗? 此外,使用T类,我想使用T.getActivity()作为Context创建视图。 问题答案: T必须扩展Fragment并实现SomeInterface 在这种情况下,您可以声明以下内容: 这将需要扩展和实现类型的对象。 此外,使用T类,我想使用T.getActivity()作为Cont
有人能告诉我第一个和第二个代码之间的区别吗?MaxPQ代表优先级队列,它是可以相互比较的“键”对象的集合。 代码1: 代码2: 第二个代码没有编译,但我不明白为什么在使用泛型时需要扩展而不是实现接口。
问题内容: 我正在尝试重构M类型确实扩展了任何内容的类和子类集,即使我们知道它必须是某种类型的子类也是如此。该类型已参数化,我希望其参数化类型可用于已经具有M值的子类。 有什么方法可以定义此类,而不必在参数列表中包括冗余的K和V泛型类型。我希望能够使编译器从子类映射到的M中推断出它们。 换句话说,我希望类声明看起来像这样: 从M的定义可以推断出K和V的类型。 问题答案: 问题在于,它们并没有真正地
问题内容: 当我以为自己终于了解了泛型时,我遇到了以下示例: 它说,如果第1行未注释,则不会编译以下内容: 如果注释了第2行,则不会编译以下内容: 在第二个示例中,允许使用脂肪族及其超类型。那么为什么不允许脂肪族? 在第一个示例中,为什么不允许? 第一个编译器错误: 第二编译器错误: 问题答案: 您的第一个声明 表示 可能 是一个(因为extends ,extends 和extended )。 在
问题内容: 您如何进行这项工作: 不做 编辑 为什么这不起作用? 我正在将编译器消息标记为错误。 问题答案: Reimeus已经指出,您在编辑中要求的内容是不可能的。我只想扩展一下原因。 人们会认为您可以使用以下内容: 实际上,这就是我第一次看到这篇文章时想到的。但这实际上会导致编译器错误: 类型变量不能跟其他界限 为了帮助我解释原因,我想引用Victor Rudometov在OracleBlog