我有以下课程
KeyValue.java
package test;
public class KeyValue<T> {
private String key;
private T value;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
Reader.java
package test;
public interface Reader<T> {
<S extends T> S read(Class<S> clazz);
}
Test.java
package test;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<KeyValue<Object>> list = find(KeyValue.class, new Reader<KeyValue<Object>>() {
@Override
public <S extends KeyValue<Object>> S read(Class<S> clazz) {
return null;
}
});
}
public static <T> List<T> find(Class<T> targetClass, Reader<T> reader) {
return null;
}
}
此处方法调用find(......)
在编译时失败并显示错误消息
Test类型中的方法find(Class,Reader)不适用于参数(Class,new Reader&gt;(){})。
此方法必须返回List<KeyValue<Object>>
类型的对象。
此设计有什么问题以及如何解决此问题。
谢谢。
答案 0 :(得分:2)
find
将T和T(在第一个和第二个arg中)定义为相同类型 - 您对find
的调用使用第一个arg中的类型Object
和类型{{ 1}}在第二个arg。
在KeyValue<Object>
声明中使用两种不同的类型标识符(例如T和X,即public static <T, X extends T> List<T> find(Class<T> targetClass, List<X> reader)
),或修复对find
的调用。
答案 1 :(得分:1)
您希望从方法find中获取您的类KeyValue的列表 但你把它定义为List注意它是一个T而不是KeyValue的列表 将ur方法声明更改为如下
private static <T> List<KeyValue<T> > find(Class<KeyValue> aClass, Reader<KeyValue<T> > reader) {
throw new UnsupportedOperationException("Not yet implemented");
}
我认为这就是你想要的
答案 2 :(得分:-1)
尝试将Test
声明为
public class Test<T> {
。