2013-05-23 14 views
9

Mam interfejs, który będzie implementowany przez kilka różnych klas, z których każda używa różnych typów i typów zwracanych. Typ zwracany można wywnioskować z metody rodzaj ogólny, ale mam problem z realizacją tego.Jak zwrócić konkretny typ podczas implementowania interfejsu ogólnego?

Interfejs wygląda obecnie:

public interface TransformUtilsBase<T> { 

    Class<?> transformToNhin(T request, BrokerContext brokerContext); 
} 

Chcę klasa IMPL wyglądać:

public class TransformUtilsXCPD implements TransformUtilsBase<foo> { 

    bar transformToNhin(foo request, BrokerContext brokerContext) { 
     code here 
    } 

W IMPL wiem co typ zwracany powinien być. Na poziomie interfejsu nie ma sposobu, aby powiedzieć.

Mogę po prostu zrezygnować z interfejsu razem i po prostu utworzyć kilka klas z tymi samymi nazwami metod, ale chciałem sformalizować je, ponieważ wszystkie są używane w tym samym celu. Tylko typy są różne.

Albo mógłbym mieć jedną dużą klasę metod statycznych, ponieważ są to operacje typu util, ale stawało się nieporęczne w zarządzaniu klasą z tak wieloma metodami o tej samej nazwie i wszystkimi niezbędnymi metodami pomocniczymi (znowu wszystko z Takie samo imię).

Implementacja interfejsu wydaje się najlepszą opcją sformalizowania funkcjonalności, mimo że nie jestem w stanie wykonywać metod statycznych. Po prostu nie mogę wymyślić, jak radzić sobie z typami zwrotu.

edycja: rozszerzenie interfejsu, aby pokazać pełny przykład, aby zapobiec dalszemu pomyłkom. Interfejs

public interface TransformUtilsBase<T, U> { 
    Class<?> transformToNhin(T request, BrokerContext brokerContext); 
    Class<?> transformToXca(U request, BrokerContext brokerContext); 
} 

IMPL

public class TransformUtilsXCPD implements TransformUtilsBase<Foo, Bar> { 
    Baz transformToNhin(Foo request, BrokerContext brokerContext) { code here } 
    Biz transformToXca(Bar request, BrokerContext brokerContext) { code here } 
} 
+0

Czy próbujesz wrócić aktualną klasę Baz lub wystąpienie Baz? Twoja edycja implikuje, że może to być druga. – Alex

+0

Dobra uwaga. Próbuję zwrócić konkretną instancję klasy Baz, utworzoną podczas procesu przekształcania. Zapis wieloznaczny jest najlepszym sposobem, jaki wiedziałem, aby przekazać moją pożądaną intencję, aby zapewnić generyczne tylko dla zmiennych metody, które można określić za pomocą typu zwrotu. –

Odpowiedz

12

dlaczego nie można zadeklarować typ na powrót typu jak dobrze, coś takiego

public interface TransformUtilsBase<T, S> { 

    S transformToNhin(T request, BrokerContext brokerContext); 
} 

można nawet "bind" zwrot typ określonego typu (na przykład Bar)

public interface TransformUtilsBase<T, S extends Bar> { 

    S transformToNhin(T request, BrokerContext brokerContext); 
} 

i zajęcia, które wdrażają zadeklaruje jako

public class TransformUtilsXCPD implements TransformUtilsBase<Foo, BarImpl> { 

    BarImpl transformToNhin(Foo request, BrokerContext brokerContext) { 
     //code here 
    } 
} 

gdzie BarImpl jest podklasą Bar

+0

Nitpick: część 'S rozszerza klasę' nie ma sensu z ostatecznym przykładem, ponieważ' Bar' z pewnością nie może rozszerzyć 'Klasy'. Po prostu użyłbym czegoś poza "Klasy" jako przykładowej górnej granicy - myślę, że PO był zdezorientowany, kiedy to napisał. –

+0

dzięki @PaulBellora usunąłem 'Class' jako górną granicę i otrzymałem inny przykład – sanbhat

+0

Wygląda świetnie! +1 –

Powiązane problemy