在java属性声明中强制使用泛型类型

时间:2014-10-10 19:02:01

标签: java generics

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的声明中,JinkiesList都具有相同的类型参数 - 这就是我要强制执行的内容。有没有办法在Java中实现这一点,而不必在U类的声明中使用列出两个参数(THello)?

我想只有一个 - 例如类似的东西:

class Hello<U extends T> implements Greeting<T> 

然而,这不编译。我必须写:

new Hello<Second, First>()

而不是:

new Hello<Second>()

即使我不关心First正文中的任何位置HelloHello的用户也不关心。)

编辑 - 正如@LouisWasserman在评论中解释的那样,我上面的一个不好的例子。也许澄清 - 让我说我一直想做:

new Hello<First>()

然后能够在U的整个主体中使用U extends First First(即上例中的SecondHelloFirst而不关心对于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}}。回到实验室......

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是什么。