我不明白为什么编译Company
。我认为它检查了extends
,但没有检查implements
?
public interface Employee
public class HourlyEmployee implements Employee
public class Company<T extends Employee>
Company<HourlyEmployee> company = new Company<>();
答案 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
接口。