这个java泛型方法语法有什么问题

时间:2011-05-13 07:38:06

标签: java generics

我有以下课程

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>>类型的对象。

此设计有什么问题以及如何解决此问题。

谢谢。

3 个答案:

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