例如,我使用一种方法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")
(所以我通过了 uncheckedUnit
而不是 a Unit<?>
)并且一切都按预期工作,但我只是对此感到好奇,我觉得抑制警告不是一个好习惯(不是它有点像空的 catch 块?)。
谢谢!
编辑:添加一些代码。
(对不起,这很长,但它详细解释了我坚持的内容。)
所以......如果我写这个(非常愚蠢的例子):
Measure measure = Measure.valueOf("3 m");
measure = Measure.valueOf(measure.doubleValue(Unit.valueOf("km")), Unit.valueOf("km"));
System.out.println(measure);
它可以工作并打印“0.0030 km”。但我收到警告“ Measure 是原始类型。对泛型类型 Measure<Q> 的引用应该参数化”超过第一次Measure
出现和警告“类型安全:方法 doubleValue(Unit) 属于原始类型 Measurable。对泛型类型的引用Measurable<Q> 应该被参数化为“over measure.doubleValue(Unit.valueOf("km"))
.
看到这些警告,我想我可以这样调整(仅限第一行):
Measure<Length> measure = Measure.valueOf("3 m");
然后我在分配的右侧收到错误消息“类型不匹配:无法从 Measure<capture#1-of ?> 转换为 Measure<Length> ”。它(Eclipse)让我可以将正确的部分转换为(Measure<Length>)
. 但随后我在右侧部分收到警告消息“类型安全:未经检查的从 Measure<capture#1-of ?> 转换为 Measure<Length> ”。修复建议:@SuppressWarnings
我宁愿避免(我猜是出于偏执的原因)。
所以,我退后一步Measure measure = Measure.valueOf("3 m");
,尝试给 通配符Measure
,显然,此时它不知道“3 m”是什么意思。它可以是 a Length
,也可以是 aMass
或 a Time
。所以我得到:
Measure<?> measure = Measure.valueOf("3 m");
此行没有警告或错误;极好的。但是,在第二行:
measure = Measure.valueOf(measure.doubleValue(Unit.valueOf("km")), Unit.valueOf("km"));
我收到错误消息doubleValue
:“ Measurable<capture#3-of ?> 类型的方法 doubleValue(Unit<capture#3-of ?>) 不适用于参数 (Unit<capture#4-of ?> ) ”。它建议强制转换Unit.valueOf("km")
为(Unit<?>)
. 美好的。现在我在完全相同的位置收到错误消息:“ Measurable<capture#3-of ?> 类型的方法 doubleValue(Unit<capture#3-of ?>) 不适用于参数 (Unit<capture#5 -of ?>) ”。请注意,数字已更改,因此这不是完全相同的参数,而是类似的原因。然后它会执行完全相同的建议,这不会导致代码发生任何变化,因为它已经完成了。
所以这就是困扰我的地方。让它工作的唯一方法似乎@SuppressWarnings
或只是忽略它们。是不是很奇怪?