Java tipo genérico que no trabajan en este caso

Tyvain:

Esto muestra la clase informaciones:

// display line numbers from a file 
display(getLineNumber(myFile));

// display users from DB
display(getUsersName(myDBRepository));

etc ...

Yo quería hacer una interfaz genérica, por lo que puede externalizar el código que muestran información.

Entonces podría hacer algo como:

myInformationElements.stream().forEach(e -> display(e.getValue());

Aquí es lo que tengo hasta ahora (no funciona):

public interface InformationElement {
    public <T> String getValue (T param);
}


public class NbFileLineInformationElement implements InformationElement{
    @Override
    public <File> String getValue(File param) {
          return *same code as in getLineNumber(myFile)*;
    }
}

public class UserInformationElement implements InformationElement{
      @Override
      public <UserRepository> String getValue(UserRepository param) {
         return *same code as in getUsersName(myDBRepository)*;
   }
}
  1. Aquí mi tipo genérico no está funcionando: El archivo no se reconize como java.io.File (lo mismo para mi repositorio APP) ¿Qué estoy haciendo mal aquí?
  2. ¿Es esta la mejor práctica para mis necesidades?
rgettman:
  1. Que haya definido los parámetros de tipo Filey UserRepositoryque está remedando los nombres de clase Filey UserRepository. Esta es una de las sorpresas de nombrar a los parámetros de tipo al igual que las clases existentes. Los parámetros de tipo no representan las clases, y no tienen límites, por lo que el compilador sólo puede asumir que tienen Objectmétodos.

  2. Esta no es la mejor práctica. En la aplicación de métodos genéricos, los métodos deben permanecer genérico y al menos tan ancho-abierta con respecto a los límites. Para ser capaz de restringir lo que los medios de parámetros de tipo más tarde, lo definen en la clase / interfaz, y dejar que las subclases proporcionan lo que se supone que significa eso para que la aplicación específica con un argumento de tipo.

La mejor solución a este problema es mover InformationElement's parámetro de tipo de la clase, y para suministrar argumentos de tipo en sus subclases. Los métodos ya no son genéricas, pero lo hacen de utilizar los parámetros de tipo definido en la interfaz / clases.

interface InformationElement<T> {
    public String getValue (T param);
}

class NbFileLineInformationElement implements InformationElement<File>{
    @Override
    public String getValue(File param) {
          return /*same code as in getLineNumber(myFile)*/;
    }
}

class UserInformationElement implements InformationElement<UserRepository>{
      @Override
      public String getValue(UserRepository param) {
         return /*same code as in getUsersName(myDBRepository)*/;
   }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=190924&siteId=1
Recomendado
Clasificación