2017-08-05 65 views
-3

如果類型爲靜態方法的整數,則會出現編譯時錯誤。通用靜態方法類型

public static <T> int countGreaterThan(T[] anArray, T elem) { 
    int count = 0; 
    for (T e : anArray) 
     if (e > elem) // compiler error 
      ++count; 
    return count; 
} 

然後我用Integer隨處替換T仍然沒問題。

public static <Integer> int countGreaterThan(Integer[] anArray, Integer elem) { 
     int count = 0; 
     for (Integer e : anArray) 
      if (e > elem) // compiler error 
       ++count; 
     return count; 
    } 

但是,一旦我改變改變整數爲不同類型像R編譯錯誤消失了。

public static <R> int countGreaterThan(Integer[] anArray, Integer elem) { 
     int count = 0; 
     for (Integer e : anArray) 
      if (e > elem) // no Compilation error 
       ++count; 
     return count; 
    } 

靜態方法類型對此>運算符的影響是什麼?

+1

你想在這裏做什麼? – Blorgbeard

+6

通過命名泛型類型'Integer',你可以映射'java.lang.Integer'。你爲什麼使用泛型? – 4castle

+0

該方法簽名沒有意義 – QBrute

回答

3

在你的情況<Integer>不是類型java.lang.Integer但只有類型參數的名行和陰影的實際通緝類型。在這一點上,它可能是<T>,<VAL><POTATO>

在你的情況,這將等同於下面的代碼

public static <POTATO> int countGreaterThan(POTATO[] anArray, POTATO elem) { 
    int count = 0; 
    for (POTATO e : anArray) 
     if (e > elem) // compiler error 
      ++count; 
    return count; 
} 

由於POTATO可以是任何類型這麼想的知道如何將其與另一個元素編譯器。編譯器不知道如何解釋e > elem

當您更改類型參數的東西比Integer不同,代碼將成爲

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

這裏的類型參數不陰影java.lang.Integer爭論了和編譯器知道如何解釋比較。

編輯:我在編輯之前發佈了這個答案,這改變了您的問題的上下文。

+0

你清除了我的困惑。 – Vikas

1

你在做什麼與<Integer>宣佈一個新的類型,並稱它Integer。請注意,這與java.lang.Integer不同,因此不適合以這種方式進行比較。

通過命名您的新類型R,您可以在聲明Integer類型的變量時推斷出java.lang.Integer

1

您陰影Integer,正確泛型類型做,這是相當不可思議的T extends Comparable<? super T>

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; 
} 

(和請使用大括號,使流量控制是明確的)。此外,如果您使用的是Java 8+,它可以被用Stream

long count = Stream.of(anArray).filter(x -> x.compareTo(elem) > 0).count(); 
+0

我已經在這裏提到了相同的代碼https://docs.oracle.com/javase/tutorial/java/generics/boundedTypeParams.html但是當我用Integer類型替換T類型,直到那個時候它很好,一旦我把Integer另一個類型R編譯錯誤消失了。 – Vikas