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

标签 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)?

我只想拥有一个 - 例如像这样的东西:

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 (即上例中的 FirstSecond)遍及 Hello 的正文不关心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) .

编辑 - 仔细想想,这可能不会以其他方式起作用。 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/

相关文章:

Enum 类型的 Java 泛型

Java 泛型 - 编译器错误

c++ - C++ 中通用项目的容器需要帮助

java - 如何在当前的Rest API中实现spring Hateoas?

Java 关联数组

java - 泛型阶乘,如何实现

generics - 是否可以在 Vec 中存储类型而不是这些类型的实例?

java - HttpURLConnection 连接重置错误处理

java - 如何检查 JAR 文件是否有效?

java - 字符串中大写字母的正则表达式