通用扩展和实现

我不明白为什么Company编译。 我认为它检查extends但不是implements

 public interface Employee public class HourlyEmployee implements Employee public class Company Company company = new Company(); 

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

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

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

例如,你有:

  

相反,它的有效语法是:

  

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

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

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

public class Company不是有效的语法。

因此, public class Company表示您的Company类的generics类型参数T必须实现Employee接口。