HowTo通用通配符作为参数

时间:2017-10-11 14:08:47

标签: java generics

我确实有以下界面。

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

会出现错误:&#34;通配符只能用作参考参数&#34;

当然它不接受&#34; getValueForKey()&#34;

中的对象

当我使用它时:

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

createTable(testImpl);

如何在我的特定接口实现中保持特定而不是在使用接口的静态方法中保持特定(最佳情况:没有未经检查的解析/强制转换的警告)

2 个答案:

答案 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>

答案 1 :(得分: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;
        }
    }
}