2011-12-26 21 views
9

這是一種對討論的後續問題:Java 7的鑽石操作方法調用

Why doesn't the diamond operator work within a addAll() call in Java 7?

Java教程,

http://docs.oracle.com/javase/tutorial/java/generics/gentypeinference.html

注意,鑽石經常用於方法調用;然而,爲了更清楚起見,建議您使用鑽石主要初始化一個變量,在其中聲明

所以,我對第一行有點困惑。當確實鑽石在方法調用中工作?

了一下如何操作的鑽石作品都可以在這裏找到更多的解釋:

http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#What%20is%20type%20argument%20inference%20for%20constructors

而從這個,我曾嘗試以下,工作正常:

給我有:

private static class Box<T>{ 
    public Box(T t){} 
} 
static void f(Box<Integer> box){} 

類似下面的調用編譯罰款:

​​

的在調用上述方法調用f()中的構造函數時使用的類型參數是從構造函數的參數(即Integer)中推斷出來的。

因此,這是什麼時候的教程說

注意,鑽石經常工作在方法意味着調用

如果沒有,任何人都可以友好地提供了一個例子,其中鑽石作品方法調用中的

+0

@gurung了一個錯字。切不好的情況下,粘貼:( – 2011-12-26 17:02:54

回答

3

因此,這是什麼時候的教程說

我想是的,雖然有幾個陷阱的當談到<>運營商的意思。

對於您的情況,Box實例化是一個非問題,因爲可以使用構造函數參數輕鬆推斷該類型。嘗試更改構造函數爲「不」,請參閱IntegerT並查看調用失敗的方式。

class BadBox<T> { 

    private T t; 

    public BadBox(){}  

    public void setT(T t) { 
     this.t = t; 
    } 

    static void f(BadBox<Integer> box){} 

    public static void main(final String[] args) { 
     f(new BadBox<>()); //fails, should have worked ideally 
    }  
} 

同樣,看一下這個類:

class Testi<R> {  
    public void doIt(Set<? extends R> sets) { 
    } 

    public static void main(final String[] args) { 
      // works since type inference is now possible 
     new Testi<CharSequence>().doIt(new HashSet<>(Arrays.asList("a"))); 

      // fails; nothing which can help with type inference 
     new Testi<CharSequence>().doIt(new HashSet<>(); 
    }  
} 

同樣,在你的鏈接的問題(關於addAll)的問題可以簡單地通過幫助了編譯器一點如下解決:

List<String> list = new ArrayList<>(); 
list.add("A"); 

// works now! use only if you love diamond operator ;) 
list.addAll(new ArrayList<>(Arrays.asList(new String[0]))); 
// or the old-school way 
list.addAll(new ArrayList<String>())); 

鑽石運營商也似乎打破,當談到實現匿名類,如下所示:

final String[] strings = { "a", "b", "c" }; 
Arrays.sort(strings, new Comparator<>() { 
    @Override 
    public int compare(String o1, String o2) { 
     return 0; 
    } 
}); 

幸運的是,在這種情況下,編譯器非常明確地提到<>不適用於匿名類。

+1

很好的答案+1 – 2011-12-26 20:14:49

0

這不是真正的方法調用。獨立聲明

new Box<>(new Integer(10)); 

也編譯。有足夠的信息來推斷TBox(即從整數參數)

在另一方面,這並不編譯

new ArrayList<>(); 

有沒有辦法知道什麼樣的名單是需要的。

Collection<String> strings = new ArrayList<>(); 

這個工程,因爲推理是由目標類型Collection<String>

+1

'新的ArrayList <>();'作爲一個獨立的語句*不*編譯。 – Holger 2014-02-05 19:05:44

1

我不認爲這是值得我們思考的,當它的工作原理,當沒有幫助。編譯器會告訴你,因此你必須重寫什麼不起作用。

沒有它背後真正的理由;它更像開發商已經把實際的編譯器實現的電流限制在特定的時間在說明書中告訴我們:這就是它必須是。

Java的8部電梯了很多這些限制沒有地獄凍結了。例如。

Arrays.asList("foo", "bar").addAll(new ArrayList<>()); 

用Java 8編譯沒有任何錯誤。那麼爲何不?