簡體   English   中英

使用下限通配符(Java)的“意外令牌”

[英]“Unexpected token” using lower-bounded wildcard (Java)

我有類似的東西:

interface Foo<T> {
    //... lines [0,45]...

/*line 46*/ <R, X super T&R> List<X> weave(R value);
    //...
}

但是IntelliJ正在報道:

  1. 錯誤:(46,18)java:>預期
  2. 錯誤:(46,19)java:非法啟動類型
  3. 錯誤:(46,26)java:'('預期
  4. 錯誤:(46,28)java:<identifier>預期
  5. 錯誤:(46,29)java:'l'預計
  6. 錯誤:(46,43)java:<identifier>預期

有什么問題? 我不允許將名字綁定到下限嗎? 或者我只允許在上限使用R&X表達式?

把它改成

interface Foo<T> {
    //... lines [0,45]...

/*line 46*/ <R> List<? super T&R> weave(R value);
    //...
}

產量

  1. 錯誤(46,31)java:>預期
  2. 錯誤(46,32)java:'('預期
  3. 錯誤(46,33)java:非法啟動類型

通過我對規范的閱讀, super只能與通配符一起使用,不能被捕獲到類型變量中; JLS 4.5.1 類似地, &僅在類型變量中有效,而不是類型參數 ,並且類型變量不能使用super

在考慮之后,這是我的解釋:類型變量的原因是消除顯式轉換以提高類型安全性。 當你聲明一個類型參數是super Foo ,你說這個參數可以是Foo 任何超類。 這意味着它可以是包括Object在內的任何東西,因此您沒有安全的方法來假設其類型滿足該范圍的對象的任何內容,因此在命名的類型變量中沒有包含任何信息; 你只是通配符並且可以調用hashCode()toString() ,但沒有特定於類型的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM