我想定义一个定义其类型的方法,如下所示:
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/