Java代码:
class First {}
class Second extends First {}
class Jinkies<T> {}
interface Greeting<T> {}
class Hello<U extends T, T> implements Greeting<T> {
private Map<Jinkies<U>, List<U>> scooby;
}
在scooby
的声明中,Jinkies
和List
都具有相同的类型参数 - 这就是我要强制执行的内容。有没有办法在Java中实现这一点,而不必在U
类的声明中使用列出两个参数(T
和Hello
)?
我想只有一个 - 例如类似的东西:
class Hello<U extends T> implements Greeting<T>
然而,这不编译。我必须写:
new Hello<Second, First>()
而不是:
new Hello<Second>()
即使我不关心First
正文中的任何位置Hello
(Hello
的用户也不关心。)
编辑 - 正如@LouisWasserman在评论中解释的那样,我上面的一个不好的例子。也许澄清 - 让我说我一直想做:
new Hello<First>()
然后能够在U
的整个主体中使用U extends First
First
(即上例中的Second
或Hello
)First
而不关心对于U
并确保void method1(U a) {}
void method2(U b) {}
始终相同。也就是说,如果我有两种方法:
U
我希望能够强制执行第一种方法的U
与第二种方法的First
相同 - 但不关心它是什么是(即Second
或<U extends T> void method1(U a) {}
<U extends T> void method2(U b) {}
),只要它是相同的。
method1(first)
无效,因为我可以致电method2(second)
和First
。
编辑 - 考虑到这一点,这可能不会以其他方式起作用。即如果只指定一个边界,则可以采用另一种方式。因此,如果仅指定Third
,我可以“向下转换”为Second
。如果仅指定Zero
,我可以“转发”到{{1}}。回到实验室......
答案 0 :(得分:2)
这是相同的类定义,但现在可能使用不同的通用名称更加明显:
class Jinkies<X> {}
interface Greeting<Y> {}
class Hello<T,U extends T> implements Greeting<T> {
private Map<Jinkies<U>, List<U>> scooby;
}
正如您所看到的,如果没有在T
这样的声明中指定new Hello<Second, First>()
,您就无法说明T
是什么。