例如,我使用方法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&lt;Length>)。但是然后我在右侧部分收到警告消息“类型安全:未经检查的类型从Measure 到Measure ”。建议修复:@SuppressWarnings,我想避免使用(我想是出于偏执的原因)。

因此,我退回到Measure measure = Measure.valueOf("3 m");并尝试将通配符赋予Measure,很明显,目前不知道“ 3 m”是什么意思。它可以是Length,也可以是MassTime。所以我得到:

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/

10-10 14:04