通用扩展和实现

时间:2015-11-13 07:04:22

标签: java generics

我不明白为什么编译Company。我认为它检查了extends,但没有检查implements

public interface Employee

public class HourlyEmployee implements Employee

public class Company<T extends Employee>

Company<HourlyEmployee> company = new Company<>();

2 个答案:

答案 0 :(得分:9)

Generics中的extends关键字与一般extends关键字的语义略有不同。

在Generics的上下文中使用extends时,例如T extends Something,这意味着T应该是 实现接口Something的类型1}}(在Something是接口的情况下),Something的子类(如果Something是一个类)。

可能原因是如果Generics支持implements关键字,这会使类型参数声明过于冗长。

例如,你有:

<T extends SomeClass implements Serializable & Observable>

相反,它的有效语法是:

<T extends SomeClass & Serializable & Observable>

实际上,您不需要拥有implements关键字。在定义类型T的边界时,您只需指出类型T派生自哪些类型,而不关心它们是接口还是类。

类型定义不是类定义。您可以将类型定义视为连接少数数据集,其结果集是您的类型T

答案 1 :(得分:5)

类型参数声明中的符号T extends Employee是指扩展类或实现接口。

public class Company<T implements Employee>不是有效的语法。

因此public class Company<T extends Employee>表示T类的泛型类型参数Company必须实现Employee接口。