这些是什么以及为什么编译:“ Tst <t extended =” class i1,=“” i2,=“” i3 =“”>“和” Tst2 <textend =“” cls =“”&=“ “ i1,=”“ i2,=”“ i3 =”“> {}”?

时间:2019-05-15 15:25:34

标签: java generics types

为什么这些行会编译(SE8)以及它们内部发生了什么?

class Tst<T extends I1, I2, I3> {}  // why compiles?
class Tst2<T extends Cls & I1, I2, I3> {} // why compiles?

我了解

class Test<T extends SomeClass & SomeInterface1 & SomeInterface2> {

   <T extends SomeClass & SomeInterface1 & SomeInterface2>  void genericMethod() {}

}

型交叉点(JLS 4.9。交叉点类型)的两个示例。

除了一个类之外,还可以实现多个接口(class Test implements I1, I2, I3

但是下面的代码击败了我:

interface I1 {}
interface I2 {}
interface I3 {}

class Cls {}

class Tst<T extends I1, I2, I3> {}  // why compiles?
class Tst2<T extends Cls & I1, I2, I3> {} // why compiles?
class Tst3<T extends Cls & I1 & I2 & I3> {} // intersection types

2 个答案:

答案 0 :(得分:4)

class Tst<T extends I1, I2, I3>

在上述情况下,I2I3是通用参数,就像T一样。 它们不引用接口,您可以将它们更改为所需的任何其他名称。 (例如class Tst<T extends I1, R, E>

如果要声明一个类Tst,则必须使用3个通用参数来实现: 一个用于T extends I1,第二个用于I2,最后一个用于I3,例如:Tst<I1, Object, Object>

答案 1 :(得分:1)

<...>中的逗号仅表示形式参数。

class Tst<..., ..., ..> {}
Tst<Integer, String String> tst;

其余的被理解了。很简单。