例如,我使用方法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<?>
),并且一切都按预期进行,但是我对此感到很好奇,感觉抑制警告不是一个好习惯(不是有点像空的捕获块吗?)。
谢谢!
编辑:添加一些代码。
(很抱歉,这很长,但是详细说明了我遇到的问题。)
我正在使用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 km”。但是我在第一个
Measure
出现时收到警告“度量是原始类型。应该对通用类型Measure 的引用进行参数设置”,并出现警告“类型安全:方法doubleValue(Unit)属于可测量的原始类型。在“measure.doubleValue(Unit.valueOf("km"))
”上应将“通用类型可测量的设置为参数”。
看到这些警告,我想我可以这样调整(仅第一行):Measure<Length> measure = Measure.valueOf("3 m");
然后,我在分配“类型不匹配:无法从Measure 转换为Measure ”的右侧收到错误消息。它(Eclipse)使我可以将正确的部分转换为(Measure<Length>)
。但是然后我在右侧部分收到警告消息“类型安全:未经检查的类型从Measure 到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
的错误消息:“类型为Measurable )不适用于参数(Unit )”。建议将Unit.valueOf("km")
强制转换为(Unit<?>)
。精细。现在,我在完全相同的位置收到错误消息:“类型为Measurable 的方法doubleValue(Unit )不适用于参数(Unit )”。请注意,数字已更改,因此这不是完全相同的参数,而是相似的原因。然后,它执行完全相同的建议,因为它已经完成了,因此不会导致代码中的任何更改。
这就是困扰我的原因。使它工作的唯一方法似乎是@SuppressWarnings
或忽略它们。奇怪吗?最佳答案
度量值类看起来像这样吗?
class Measure<T> { double doubleValue(Unit<T> unit) { ... } }
在这种情况下,引用类型为Measure<?>
并不意味着您可以将任何类型的Unit
传递给doubleValue
方法。相反,这意味着Measure
实例具有未知的泛型类型,并且将Unit
传递给其doubleValue
方法并不安全,因为编译器无法确保类型兼容。
通配符并不表示“任何类型”;它的意思是“未知类型”。
更新:valueOf(CharSequence)
返回未知类型的Measure
,即Measure<?>
。要将其安全地转换为期望的Measure
类型,必须使用Measure.asType()
方法。对于由Unit
方法创建的目标Unit.valueOf(CharSequence)
同样。Measure<?> unknownMeasure = valueOf("3 m"); Unit<?> unknownUnit = Unit.valueOf("km"); Measure<Length> length = unknownMeasure.asType(Length.class); Unit<Length> kilometer = unknownUnit.asType(Length.class); length.doubleValue(kilometer);
查看Measure
类文档中的示例。它们将提供一些额外的深度。关于java - 为什么不能将通配符与接收参数化参数的方法一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2150769/