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)?
我只想拥有一个 - 例如像这样的东西:
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)
.
编辑 - 仔细想想,这可能不会以其他方式起作用。 IE。如果只指定一个界限,则有可能走另一条路。所以如果指定 First
只是,我可以“向下转换”为 Third
.如果指定 Second
只是,我可以“向上转换”到 Zero
.回到实验室……
最佳答案
这是相同的类定义,但现在使用不同的通用名称可能更明显:
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
是。
关于java - 在 java 属性声明中强制使用泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26306303/