2017-10-06 10 views
-1

雖然遵循Java課程,但我被要求將常規類轉換爲通用類。我認爲我部分成功了,但是可以找到一種方法讓它100%正確。Java泛型未經檢查的警告和方法不能從靜態內容引用

public class ElementUtils { 
    public static <T> List transformedList(List<T> inList, Function<T, T> f) { 
     List<T> outList = new ArrayList<>(); 
     for (T s : inList) { 
      outList.add(f.apply(s)); 
     } 
     return outList; 
    } 
} 

測試類

public class Test { 
    public static void main(String[] args) { 
     List<String> lijst = Arrays.asList("Jan", "Jos", "Anna", "Pieter", "Johan"); 

     List<String> upCaseList = ElementUtils.transformedList(lijst, String::toUpperCase); 
     List<String> replaceList = ElementUtils.transformedList(lijst, s -> s.replace("i", "IETS")); 
     List<String> exclList = ElementUtils.transformedList(lijst, s -> s + "!"); 
     List<Integer> wordLengths = ElementUtils.transformedList(lijst, String::length); 

     System.out.println(upCaseList); 
     System.out.println(replaceList); 
     System.out.println(exclList); 
     System.out.println(wordLengths); 
    } 
} 

當我刪除的最後一條語句wordLengths它工作正常,但拋出一個警告。通過最後一條語句,它告訴我不能從靜態內容引用方法。

錯誤:

Error:(13, 49) java: method transformedList in class cvo.ex2.ElementUtils cannot be applied to given types; 
    required: java.util.List<T>,java.util.function.Function<T,T> 
    found: java.util.List<java.lang.String>,String::length 
    reason: inference variable T has incompatible bounds 
    equality constraints: java.lang.String 
    lower bounds: java.lang.Integer 

我不明白我在這裏失蹤......謝謝你的幫助。

+0

什麼是確切的消息? – Stultuske

+0

更新OP與消息 – DarkLite1

+0

這可能能夠幫助:https://stackoverflow.com/questions/27522741/incompatible-types-inference-variable-t-has-incompatible-bounds – Stultuske

回答

1

您爲輸入和輸出提供相同的通用類型T.你需要一個輸入類型T和一個結果類型R,並返回一個R類型的列表來擺脫警告。

public static <T,R> List<T> transformedList(List<T> inList, Function<T, R> f) { 
    List<R> outList = new ArrayList<>(); 
    for (T s : inList) { 
     outList.add(f.apply(s)); 
    } 
    return outList; 
} 
+0

謝謝,但Intellij告訴我當我將代碼複製到測試中時'無法解析符號T'。 – DarkLite1

+0

@ DarkLite1他引入了一個新的泛型類型,這是錯誤的。你想使用'T'的通用類型。更新了他的答案。 –

+0

對不起,結果類型也必須聲明。我更新了我的答案。 Murat編輯並沒有解決你輸出類型不總是與輸入類型相同的問題(前三個例子中的字符串,第四個例子中的整數) –

0

基本上< T>指型但在一個方法調用< T>必須是相同的無處不在。您不能在同一方法調用中使用< T>一次作爲整數,然後使用字符串。

在這一行:列表< T> outList = new ArrayList <>();

< T>是什麼意思,因爲它一旦被整數和一次String在同一個調用中。 Java不能猜測;)