Java tipo genérico não funciona neste caso

Tyvain:

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)*;
   }
}
  1. 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?
  2. É esta a melhor prática para minhas necessidades?
rgettman:
  1. Você definiu parâmetros de tipo Filee UserRepositoryque são sombreamento os nomes de classe Filee UserRepository. 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êm Objectmétodos.

  2. 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)*/;
   }
}

Acho que você gosta

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