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

泛型扩展和实现

公冶翰池
2023-03-14
问题内容

我不明白为什么要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是一个类)。

可能的原因是,如果implementsGenerics中支持该关键字,则会使类型参数声明过于冗长。

例如,您将拥有:

<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