2016-02-03 17 views
6

Więc mam interfejs -częściowe rodzajowych w Javie

public interface GenericTranslator <From, To> { 
    To translate(From from); 
} 

i mieć klasę implementującą to

public class TimeToStringTranslator implements GenericTranslator <Time, String> { 
    String translate(Time time) { ... } 
} 

Ale teraz chce mieć abstrakcyjną warstwę gdzie input type From jest Time

// an abstract class with partial generic defined 
public abstract class AbstractTimeTranslator<Time, To> implements GenericTranslator<Time, To> { 

    @Override 
    To translate(Time time) { 
     doSomething(); 

     return translateTime(time); 
    } 

    protected abstract To translateTime(Time time); 
} 

// concrete class 
public class TimeToStringTranslator extends AbstractTimeTranslator<Time, String> { 
    String translateTime(Time time) { .... } 
} 

Czy to możliwe w Javie? Próbowałem, Java traktuje Time jako nazwą rodzajową w AbstractTimeTranslator

Odpowiedz

9

Jeśli Time jest rzeczywisty typ argumentu zamiast innego parametru typu rodzajowego, to nie powinien zadeklarować Time jako parametr typu rodzajowego w definicji klasy AbstractTimeTranslator; po prostu użyj go jako argumentu typu w klauzuli implements.

Parametr ten określa tylko parametr typu To w tej klasie.

abstract class AbstractTimeTranslator<To> implements GenericTranslator<Time, To> { 

konsekwencji, trzeba tylko dostarczyć jeden typ argumentu w klauzuli betonowej podklasy extends.

class TimeToStringTranslator extends AbstractTimeTranslator<String> { 
+2

Nie mogę oprzeć się wrażeniu, że ten problem zostałby prawdopodobnie uniknięty, gdyby przestrzegano konwencji jednoliterowych argumentów. – VGR