2017-08-18 8 views
8

Obecnie używam Roaster do generowania interfejsów, ale mój interfejs ma przypisane typowe typy.Korzystając z Roastera, w jaki sposób mogę wygenerować interfejs z określonym typem generycznym (lub typami)?

Oto, co starałem się generować je zacząć:

String entityName = "SimpleEntity"; 

JavaInterfaceSource repository = Roaster.create(JavaInterfaceSource.class) 
     .setName(entityName + "Repository"); 

JavaInterfaceSource jpaInterface = repository.addInterface(JpaRepository.class); 
jpaInterface.addTypeVariable(entityName); 
jpaInterface.addTypeVariable("String"); 

ale powyższe wyniki w wygenerowanego kodu, który wygląda (coś) jak poniżej:

public interface SimpleEntityRepository<SimpleEntity> 
     extends 
      org.springframework.data.jpa.repository.JpaRepository { 
} 

Co ja właściwie chcę to dla generycznego, który ma być powiązany z JpaRepository. Jak to zrobić?

Odpowiedz

3

JavaInterfaceSource#addInterface jest przeciążony sygnaturą String. Oznacza to, że możesz utworzyć typ ogólny, wykonując sprytne połączenie ciągów. Zwraca także to samo wystąpienie z JavaInterfaceSource, takie, że w powyższym przykładzie, jpaInterface == repository, więc operacja jest zarówno niepotrzebna, jak i wprowadzająca w błąd.

Ponieważ jest przeciążone String, dodajemy po prostu generyczne (czytaj: nawiasy kątowe), które chcemy sami.

repository.addInterface(JpaRepository.class.getSimpleName() + 
            "<" + entityName + ", String>"); 

To nie może być tak rodzaju elegancka jak reszta API, ale generuje odpowiedniego obiektu w końcu.

public interface SimpleEntityRepository 
     extends JpaRepository<SimpleEntity, String> { 
} 
+0

Makoto, jak na swojej dobroci, patrząc na kod wygląda najlepiej łatwo dostępnego rozwiązania. Jedyną inną metodą jest użycie metody 'addInterface (JavaInterface )' ale ['JavaInterface'] (http://javadox.com/org.jboss.forge.roaster/roaster-api/2.18.1.Final/org /jboss/forge/roaster/model/JavaInterface.html) nie obsługuje określania podstawień dla parametrów ogólnych: nie jest obsługiwany przez ['TypeVariableSource'] (http://javadox.com/org.jboss.forge.roaster /roaster-api/2.18.1.Final/org/jboss/forge/roaster/model/source/TypeVariableSource.html). – SergGr

Powiązane problemy