在java属性声明中强制执行泛型类型

在java属性声明中强制执行泛型类型,java,generics,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; } 然而,这并不适用于编译

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;
}
然而,这并不适用于编译。我必须写:

new Hello<Second, First>()
但是可以在
Hello
的整个正文中使用
U
中的任何
U
(即上例中的
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) {}
void方法1(U a){
无效方法2(U b){}
不会工作,因为我可以调用
method1(第一个)
method2(第二个)


编辑-仔细想想,这可能不会以另一种方式工作。也就是说,如果只指定一个边界,则可以选择另一个边界。因此,如果只指定
第一个
,我可以“向下转换”到
第三个
。如果只指定
Second
,我可以将
向上转换为零。回到实验室…

这是相同的类定义,但现在可能更容易看到不同的泛型名称:

class Jinkies<X> {}
interface Greeting<Y> {}
class Hello<T,U extends T> implements Greeting<T> {
  private Map<Jinkies<U>, List<U>> scooby;
}
class Jinkies{}
接口问候语{}
类Hello实现问候语{
私人地图史酷比;
}

正如您所见,如果不在声明中指定
T
,比如
newhello()
,您就无法说出
T
是什么。

如果您编写了
newhello
,那么它将实现什么
问候语
?你怎么知道?听起来好像
Greeting
根本不应该有
t
。@LouisWasserman
Greeting
t
是因为其他原因。我同意由于你提到的原因,
newhello()
不起作用,这是我的一个坏例子。编辑以澄清。
void method1(U a) {}
void method2(U b) {}
<U extends T> void method1(U a) {}
<U extends T> void method2(U b) {}
class Jinkies<X> {}
interface Greeting<Y> {}
class Hello<T,U extends T> implements Greeting<T> {
  private Map<Jinkies<U>, List<U>> scooby;
}