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)*;
}
}
- 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í?
- ¿Es esta la mejor práctica para mis necesidades?
Que haya definido los parámetros de tipo
File
yUserRepository
que está remedando los nombres de claseFile
yUserRepository
. 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 tienenObject
métodos.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)*/;
}
}