例如,我使用方法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")
(所以我通過一個unchecked Unit
而不是Unit<?>
),並且一切都按預期工作,但我只是好奇這一點,我覺得禁止警告不是一件好事練習(是不是有點像空的catch塊?)。
謝謝!
編輯:添加一些代碼。
(對不起,這是相當長的,但在細節解釋了我卡上。)
我使用JSR-275version 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公里」。但我收到警告「措施是原始類型。參考通用類型措施< Q>應參數化」在第一個Measure
發生和警告「類型安全:方法doubleValue(單位)屬於原始類型可測量。參考通用類型可測量< Q>應參數化「超過measure.doubleValue(Unit.valueOf("km"))
。
看到這些警告,我想我可以調整這樣(只第一行):
Measure<Length> measure = Measure.valueOf("3 m");
然後我得到分配的「類型不匹配右側部分的錯誤消息:無法從度量轉換<捕獲#1 of?>測量<長度>「。它(Eclipse)爲我提供了正確的部分(Measure<Length>)
。但是然後我在右邊的部分得到警告信息「類型安全性:從措施<捕獲#1-of?>未檢查鑄造到措施<長度>」。修復建議:@SuppressWarnings
,我寧願避免(因爲我猜測偏執狂的原因)。
因此,我回到Measure measure = Measure.valueOf("3 m");
並試圖給通配符Measure
,很明顯,它不知道「3米」在這一刻意味着什麼。它可能是Length
,也可能是Mass
或Time
。所以我得到:
Measure<?> measure = Measure.valueOf("3 m");
並沒有警告或錯誤在這一行;太棒了。但是,在第二行:
measure = Measure.valueOf(measure.doubleValue(Unit.valueOf("km")), Unit.valueOf("km"));
我得到與錯誤消息doubleValue
:?「在類型的方法的doubleValue(?單位<捕獲#3的>)可測量<捕獲#3的>不適用於參數(Unit < capture#4 of?>)「。它建議將Unit.valueOf("km")
作爲(Unit<?>)
。精細。 「類型Measurable < capture#3-of?>中的方法doubleValue(Unit < capture#3 of?>)不適用於參數(單元< capture# 5-of>)「。注意數字已經改變了,所以這不是完全相同的參數,但是類似的原因。然後它執行完全相同的建議,導致代碼中無任何改變,因爲它已經完成。
所以這就是竊聽我。獲得它的唯一方法似乎是@SuppressWarnings
或者只是忽略它們。這不奇怪嗎?
你有一些我們可以看到的實際代碼嗎?泛型是非常「魔鬼的細節」。 – 2010-01-27 22:32:34
我同意克里斯。你可以通過'Unit
對不起,延遲,做不了更快。我寫了一個示例代碼,因爲我認爲在現實生活中與這個混合的一百行代碼並不相關。 – Joanis 2010-01-28 02:50:14