2011-05-13 71 views
6

我有以下类有什么不对这个Java泛型方法的语法

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

这个设计有什么问题,以及如何解决这个问题。

谢谢。

回答

2

find限定T和T(在第一和第二ARG)为相同类型的 - 你到find呼叫使用在第一个参数的类型Object并且在第二ARG类型KeyValue<Object>

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

+0

我改变了它,这是我的错误。现在都是'KeyValue'类型。 – 2011-05-13 07:45:39

+0

所以这解决了你的问题? – BertNase 2011-05-13 07:46:34

+0

不,仍然有错误的方法找到(类,读者)类型测试不适用于参数(类,新的读者>(){})' – 2011-05-13 07:47:43

-1

试图声明Test作为

public class Test<T> {

1

你想从你的方法类KEYVALUE的列表中找到 但你把它定义为列表。注意:它是T的列表中未键值 改变乌尔法声明如下

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

我认为这是你想要的