在java属性声明中强制执行泛型类型
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中实现这一点,而不必在Hello
类的声明中列出两个参数(U
和T
)
我只想要一个,例如:
class Hello<U extends T> implements Greeting<T>
然而,这并不适用于编译。我必须写:
new Hello<Second, First>()
而不是:
new Hello<Second>()
即使我不关心First
的主体中的任何地方(也不关心Hello
的用户)
编辑——正如@LouisWasserman在评论中所解释的,我上面提到的是一个糟糕的例子。也许是为了澄清——假设我一直想做:
new Hello<First>()
但是,然后能够在整个Hello
的身体中使用任何U
,其中U extends First
(即上述例子中的First
或Second
),而无需关心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 楼答案
这是同一个类定义,但现在使用不同的泛型名称可能更容易看到:
如您所见,如果不在像
new Hello<Second, First>()
这样的声明中指定T
,您就无法说出T
是什么