有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在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的声明中,JinkiesList都有相同的类型参数——这就是我想要强制执行的。有没有一种方法可以在Java中实现这一点,而不必在Hello类的声明中列出两个参数(UT

我只想要一个,例如:

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(即上述例子中的FirstSecond),而无需关心First,并且确保U始终是相同的。也就是说,如果我有两种方法:

void method1(U a) {}
void method2(U b) {}

我希望能够强制执行第一种方法的U与第二种方法的U相同,但不关心它是什么(即FirstSecond),只要它是相同的

<U extends T> void method1(U a) {}
<U extends T> void method2(U b) {}

不起作用,因为我可以称之为method1(first)method2(second)

编辑——仔细想想,这可能不会以另一种方式起作用。也就是说,如果只指定一个界限,就有可能走另一条路。因此,如果只指定First,我可以“向下转换”到Third。如果只指定Second,我可以“向上投射”到Zero。回到实验室


共 (1) 个答案

  1. # 1 楼答案

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

    class Jinkies<X> {}
    interface Greeting<Y> {}
    class Hello<T,U extends T> implements Greeting<T> {
      private Map<Jinkies<U>, List<U>> scooby;
    }
    

    如您所见,如果不在像new Hello<Second, First>()这样的声明中指定T,您就无法说出T是什么