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

6

I've the following classes

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>() {})不适用。

该方法必须返回类型为 List<KeyValue<Object>> 的对象。

这个设计有什么问题,如何修复。

谢谢。

3个回答

2

find定义了第一个和第二个参数的类型必须相同,而你调用find时在第一个参数中使用了类型Object,在第二个参数中使用了类型KeyValue<Object>

要么在find声明中使用两个不同的类型标识符(例如T和X,即public static <T, X extends T> List<T> find(Class<T> targetClass, List<X> reader)),要么修复对find的调用。


我已经更改了它,那是我的错误。现在两者都是 KeyValue 类型。 - Arun P Johny
不,所以它仍然出现了错误The method find(Class<T>, Reader<T>) in the type Test is not applicable for the arguments (Class<KeyValue>, new Reader<KeyValue<Object>>(){}) - Arun P Johny
1
正如您从错误消息中看到的那样,Java将第一个T解释为<KeyValue>,将第二个T解释为<KeyValue<Object>>,因此它们不相同--也许应该更改您的签名为find(Class<X extends T> targetClass, Reader<T> reader)find(Class<T> targetClass, Reader<X super T> reader),具体取决于您想要表达的内容(我假设是第一个)。 - BertNase
KeyValue<Object>和KeyValue.class是否共享您上面暗示的继承层次结构? - Ryan Fernandes

1

你想从你的方法find中获取一个类KeyValue的列表,但是你将其定义为List,请注意它是T而不是KeyValue的列表。请更改你的方法声明如下:

private static <T> List<KeyValue<T> > find(Class<KeyValue> aClass, Reader<KeyValue<T> > reader) {
    throw new UnsupportedOperationException("Not yet implemented");
}

我想这就是你想要的


-1
尝试将Test声明为: public class Test<T> {

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接