2017-10-11 55 views
-2

我有以下接口。HowTo通用通配符作爲參數

interface ITest<T extends Object>{ 
    List<T> getValues(); 
    Object getValueForKey(String key, T dataObject); 
} 

,所以我想用它的靜態方法,如:

static createTable(ITest<?> test){ 
    for(? dataObject: test.getValues()){ 
     Object value = test.getValueForKey("KEY", dataObject) 
    } 
} 

,它會彈出錯誤:「通配符可以使用僅作參考參數」

,當然這是不接受一個對象在 「getValueForKey()」

當我使用這樣:

ITest<Option> testImpl = new ITest<Option>(){ 
    @Override 
    List<Option> getValues(){ 
      new ArrayList<>(10); 
    } 
    ... 
} 

createTable(testImpl); 

如何能夠做到保持特定的在我的特定接口實現,但不是在使用接口的靜態方法(最好的情況:沒有選中解析/鑄造的警告)

+0

我不明白這個問題。這個?通配符表示「我不在乎類型」。換句話說:「我知道關於這種類型的nada zip niente」。我沒有明白你爲什麼要將這種非知識與「我有一個特定的已知類型T」「對齊」。 – GhostCat

+0

你期待什麼? dataObject'做什麼? – Oleg

+0

這很簡單,靜態方法將用於許多不同的類型,並且不希望每次都實現它的類型,因爲它有很多冗餘的代碼 –

回答

1

你應該使用generic method

static <T> void createTable(ITest<T> test) { 
    for (T dataObject : test.getValues()) { 
     Object value = data.getValueForKey("KEY", dataObject); 
    } 
} 

當您使用ITest<?> test你只需要聲明的是你的參數可以是任何類型的,你不能?dataObject型後使用。當您聲明通用方法時,可以使用T作爲類型。這將在編譯時推斷,因爲你用ITest<Option> testImpl來調用T將會是Option

您也不應該這樣做<T extends Object>這是一個完全無用的界限,相當於<T>

0
public class MyClass { 
    static class ITest<T> { 
     T[] getValues() { 
      return null; 
     } 
    } 

    static <T extends Object> void createTable(ITest<T> test) { 
     for(T dataObject : test.getValues()) { 
      T value = dataObject; 
     } 
    } 
} 
+0

無法解析符號T編輯:很好沒有編譯錯誤。順便說一句,我沒有downvote ;-) –

+0

你做錯了什麼,下面的代碼編譯和運行 –

+0

它的一些rager不要擔心,好它不是你 –