为什么这些行会编译(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
答案 0 :(得分:4)
class Tst<T extends I1, I2, I3>
在上述情况下,I2
和I3
是通用参数,就像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;
其余的被理解了。很简单。