2012-07-11 139 views
3

可能重複:
Java: Array of primitive data types does not autobox爲什麼autoboxing在這種情況下不適用於泛型?

我最近一直在做一些Java(主要是因爲什麼我在大學裏爲我現在的工作做了回顧不涉及任何Java在所有),而一件從未正確介紹給我們的東西是泛型。

我已經做了甲骨文的Java網站上的泛型教程,我一直在用下面的例子難倒我修改了一下:

public static <Integer extends Comparable<Integer>> int countGreaterThan(Integer [] anArray, Integer elem) { 
    int count = 0; 
    for (Integer e : anArray) 
     if (e.compareTo(elem) > 0) 
      ++count; 
     return count; 
} 

而且我用這個方法來比較整數數組用下面的整數:

Integer [] numarr = {1, 2, 3, 4 , 5}; 
Integer num = new Integer(5); 

int count = Util.countGreaterThan(arrnum, num); 

這似乎是工作正常,但是如果我通過一個基本數組和原始INT,它不會:

int [] arrnum = {1, 2, 3, 4 , 5}; 
int othernum = 3; 

int count = Util.countGreaterThan(arrnum, othernum); 

編譯器會抱怨有:

method countGreaterThan in class Generics.Util 
cannot be applied to given types; 
required: Integer[],Integer 
found: int[],int 
reason: no instance(s) of type variable(s) 
Integer exist so that argument type int conforms to formal parameter type Integer 

的教程似乎是很固執的認爲Java將永遠autobox /拆箱的對象和原語爲必要,但它不會做,在這種特殊情況下,我是什麼失蹤?

另外什麼可能是一種很好的方式來儘可能地概括這種比較方法?如果我使用T而不是Integer,那麼它會查找T對象,而不是我傳遞給它的任何東西。

我很抱歉,如果這篇文章令人困惑,並且我對上面提到的東西看起來很無知,那只是我一直主要作爲perl程序員(而且並不是特別有經驗的程序員)並在那裏概括似乎不是一個問題(由於缺乏類型強制執行)。

在此先感謝!

+0

使用'Integer'作爲一個類型變量是一個非常糟糕的主意 – newacct 2012-07-11 18:08:35

回答

1

下面的代碼似乎就我所看到的工作:

public static <Integer extends Comparable<Integer>> int countGreaterThan(Integer [] anArray, Integer elem) { 
    int count = 0; 
    for (Integer e : anArray) { 
     if (e.compareTo(elem) > 0) 
      ++count; 
     return count; 
} 

雖然我得到一個警告"The type parameter Integer is hiding the type Integer"。請參閱@ErichSchreiner的答案,以解釋爲什麼自動裝箱在這裏不起作用。

你的方法的一個很好的概括是:

public static <T extends Comparable<? super T>> int countGreaterThan(T[] anArray, T elem) { 
    int count = 0; 
    for (T e : anArray) { 
     if (e.compareTo(elem) > 0) { 
      ++count; 
     } 
    } 
    return count; 
} 

你真正關心的是anArray具有相同類型的元素作爲elem是,和它媲美它自己的類型。

+0

你打我... :-) – 2012-07-11 08:29:20

+0

雖然你做了一個更好的解釋自動裝箱問題,增加了一個參考。 – Keppil 2012-07-11 08:32:46

+0

爲獲得最佳效果,請使用'>' – newacct 2012-07-11 18:09:23

1

您的聲明countGreaterThan()隱藏內置類型Integer。爲了澄清,考慮稍作修改的版本:

public static <I extends Comparable<I>> int countGreaterThan(I [] anArray, I elem) { 
    int count = 0; 
    for (I e : anArray) 
     if (e.compareTo(elem) > 0) 
      ++count; 
     return count; 
} 

現在應該很明顯,你在呼喚第二次嘗試不能工作,因爲就沒有自動裝箱完成。要使泛型能夠工作,您需要提供對象,而不是基元。

+0

啊哈,謝謝!我認爲既然我可以用一個Integer返回類型聲明一個普通的方法,然後傳遞一個原語給它,沒有任何問題,我可以在泛型中做同樣的事情。 我也嘗試將一個泛型類傳遞給count方法(沿着'public class Box '行),但是失敗: 'required:T [],T found:泛型。盒[],Generics.Box 原因:推斷類型不符合宣告約束(S) ' 它是安全的假設,我無法通過泛型類的countGreaterThan(與作爲簽名)要麼? 謝謝! @Keppil – Nobilis 2012-07-11 08:54:16

相關問題