【发布时间】:2010-01-27 22:25:05
【问题描述】:
例如,我使用Measure.doubleValue(Unit<?> unit) 方法返回测量值的double,以指定的Unit 表示。如果我将 Unit<?> 变量传递给它,我会收到仍然非常神秘(对我而言)的错误消息:
The method doubleValue(Unit<capture#27-of ?>) in the type Measurable<capture#27-of ?> is not applicable for the arguments (Unit<capture#28-of ?>)
如果有人能解释#27-of ?(或任何其他数字)的含义,以及是否有一种优雅的方法可以摆脱这种情况,我将不胜感激。到目前为止,我删除了<?> 并设置了调用方法@SuppressWarnings("unchecked")(所以我传递了一个未经检查的Unit 而不是Unit<?>),一切都按预期工作,但我只是对此感到好奇,我感觉抑制警告不是一个好习惯(是不是有点像空的 catch 块?)。
谢谢!
编辑:添加一些代码。
(对不起,这很长,但它详细解释了我卡在什么地方。)
我正在使用JSR-275 version 0.9.4(最近的)。
所以...如果我写这个(非常愚蠢的例子):
Measure measure = Measure.valueOf("3 m");
measure = Measure.valueOf(measure.doubleValue(Unit.valueOf("km")), Unit.valueOf("km"));
System.out.println(measure);
它可以工作并打印“0.0030 公里”。但我收到警告“Measure 是一个原始类型。对泛型类型 Measure 的引用应该参数化
”在第一次出现 Measure 和警告“类型安全:方法 doubleValue( Unit) 属于原始类型 Measurable。对泛型类型 Measurable 的引用应在
"。measure.doubleValue(Unit.valueOf("km")) 上进行参数化
看到这些警告,我想我可以这样调整(仅限第一行):
Measure<Length> measure = Measure.valueOf("3 m");
然后我在分配的右侧收到错误消息“类型不匹配:无法从 Measure(Measure&lt;Length>)。但随后我在右侧部分收到警告消息“Type safety: Unchecked cast from Measure@SuppressWarnings 我宁愿避免(我猜是出于偏执的原因)。
所以,我退回到Measure measure = Measure.valueOf("3 m"); 并尝试给Measure 提供通配符,显然,此时它不知道“3 m”是什么意思。它可以是Length,也可以是Mass 或Time。所以我得到:
Measure<?> measure = Measure.valueOf("3 m");
并且这一行没有警告或错误;极好的。但是,在第二行:
measure = Measure.valueOf(measure.doubleValue(Unit.valueOf("km")), Unit.valueOf("km"));
我收到doubleValue 的错误消息:“MeasurableUnit.valueOf("km") 转换为(Unit<?>)。美好的。现在我在完全相同的位置收到错误消息:“Measurable
这就是困扰我的地方。让它工作的唯一方法似乎是@SuppressWarnings 或忽略它们。是不是很奇怪?
【问题讨论】:
-
您有一些我们可以查看的实际代码吗?泛型是非常“魔鬼在细节中”的东西。
-
我同意克里斯的观点。您可以通过使用
Unit<Object>而不是Unit<?>来解决您的问题,但是没有代码就很难说。 -
抱歉耽搁了,不能做得更快。我写了一个示例代码,断章取义,因为我认为与现实生活中的代码混合的一百行是不相关的。
-
额外的代码有帮助。你绝对不应该压制警告; JSR-275 竭尽全力利用泛型。我用解决方案更新了我的答案。
标签: java generics wildcard parameterized