java - 如何在另一个有界类型上定义方法有界类型?

标签 java generics

我想定义一个定义其类型的方法,如下所示:

List<R> toList(JsArray<T> array)

这样 T 是有界的,因此它是:

  • T extends SomeClass , 和
  • T extends R

我试过类似的方法,但无济于事:

<R, T extends R & SomeClass> List<R> toList(JsArray<T> array)

(出于好奇,这是为了能够使用 GWT Overlay Types with Interfaces )

最佳答案

这个怎么样?

<T extends SomeClass> List<? super T> toList(JsArray<T> array)

编辑:

我想我看到了你的用例。从评论中,您想要指定返回类型,这样您就没有未经检查的转换。

但是您实际上并没有传递任何东西来告诉方法要创建什么。因为我总是可以用 R = T 调用 toList() ,你唯一能做的总是有效的(对于所有 R super T )是返回一个 List<T> ,这使得 R不需要参数...但这不是您想要的。

你必须传入一些东西来告诉方法要实例化什么样的对象。通常我们可以这样:

<R, T extends SomeClass> List<R> toList(JsArray<T> array, Class<R> cls)

并称它为

toList(arrayIHave, WhatIWant.class)

现在这可以工作了,但是您会提示它有错误条件,因为没有捕获“T extends R”约束。但实际上,即使您添加了约束条件,您仍然会遇到错误情况。

我可以为 R 使用任意 接口(interface)通过制作 T延伸 SomeClass并实现 R .您无法有意义地实例化任意接口(interface),因此对于许多 R,T满足您的约束的对,您将必须返回 null 或抛出异常或其他东西。

毫无疑问,一些规则决定了您将返回哪个 R,但甚至没有办法考虑指定捕获该规则的通用约束,所以 在某处进行未经检查的转换。如果您使用这样的签名,至少您可以将它放在方法中,而不是在您使用它的任何地方都出现警告或注释。

关于java - 如何在另一个有界类型上定义方法有界类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35446650/

相关文章:

java - JUnit 5 测试

java - 使用 JAXB 从 XML 文件读取时如何使用继承

java - e4 将 ESelectionService 设置为空

java - 使用泛型的 Hashmap getter setter

c# - 无法在 C# 中将具体类型转换为其接口(interface)的泛型版本

python - 装饰器更改通用返回类型时的键入函数

java - 使用图像的二进制值更新 xml 文件

java - 在 JSF 中放置应用程序设置的位置

具有 Object 类型成员变量的 Java 类

java - 向调用者公开实现信息?