2011-05-13 8 views
6

He las siguientes clasesLo que está mal con esta sintaxis de Java método genérico

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

} 

Aquí el método llama al find(......) está fallando en tiempo de compilación con el mensaje de error

El hallazgo método (Clase, lector) en el tipo de prueba no es aplicable a los argumentos (Clase, nuevo lector>() {}).

Este método debe devolver el objeto del tipo List<KeyValue<Object>>.

¿Qué hay de malo en este diseño y cómo solucionarlo?

Gracias.

Respuesta

2

find define T y T (en primera y segunda arg) para ser de mismo tipo - su llamada a find utiliza el tipo de Object en el primer argumento y el tipo KeyValue<Object> en la segunda arg.

O utilice dos identificadores de tipos diferentes (por ejemplo, T y X, es decir, public static <T, X extends T> List<T> find(Class<T> targetClass, List<X> reader)) en su declaración find o repare su llamada al find.

+0

Lo he cambiado, fue un error de mi parte. Ahora ambos son de tipo 'KeyValue'. –

+0

¿Así que esto resolvió su problema? – BertNase

+0

No, todavía tiene el error 'El método find (Clase , Reader ) en el tipo Prueba no es aplicable para los argumentos (Clase , nuevo Reader >() {})' –

-1

intentaremos declarar como Test

public class Test<T> {.

1

que desea obtener una lista de sus KeyValue clase de su método de encontrar pero u definida como lista de notas que se trata de una lista de T no KeyValue cambiar ur declaración de método a ser el siguiente

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

Creo que esto es lo que quiere

Cuestiones relacionadas