Esta classe exibe informações:
// display line numbers from a file
display(getLineNumber(myFile));
// display users from DB
display(getUsersName(myDBRepository));
etc ...
Eu queria fazer uma interface genérica, para que eu possa exteriorizar o código que exibem informações.
Então eu poderia fazer algo como:
myInformationElements.stream().forEach(e -> display(e.getValue());
Aqui está o que eu tenho até agora (não 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)*;
}
}
- Aqui o meu tipo genérico não está funcionando: O arquivo não está reconize como java.io.File (mesmo para meu repositório jpa) O que estou fazendo de errado aqui?
- É esta a melhor prática para minhas necessidades?
Você definiu parâmetros de tipo
File
eUserRepository
que são sombreamento os nomes de classeFile
eUserRepository
. Esta é uma das surpresas de nomear parâmetros de tipo da mesma forma que as classes existentes. Os parâmetros de tipo não representam as classes, e eles não têm limites, para que o compilador só posso supor que eles têmObject
métodos.Esta não é a melhor prática. Ao implementar métodos genéricos, os métodos devem permanecer genérico e pelo menos tão escancarada com respeito a limites. Para ser capaz de restringir o que os meios parâmetro de tipo depois, defini-lo na classe / interface, e deixar subclasses fornecer o que é suposto que significa para que a implementação específica com um tipo de argumento.
A melhor solução aqui é mover InformationElement
's parâmetro de tipo para a classe, e fornecer argumentos de tipo em suas subclasses. Os métodos não são mais genéricos, mas eles usam os parâmetros de tipo definidos na interface / classes.
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)*/;
}
}