2015-12-29 9 views
6

Ich weiß, dass die Angabe einer zusätzlichen Grenze, wenn die erste Grenze ein Typparameter ist, in Java nicht möglich ist; Ich frage mich jedoch, ob jemand einen alternativen Weg kennt, etwas Ähnliches zu tun und es zur Kompilierzeit sicher zu halten? Ich habe unten ein Beispiel angegeben.Gibt es eine alternative Möglichkeit, eine zusätzliche Grenze anzugeben, wenn die erste Grenze ein Typparameter ist?

In dem folgenden Code, was ich meine, ist dies: <E extends T & Comparable<T>>. In dieser Situation möchte ich den eingebauten Komparator verwenden können, wenn der Typ T vergleichbar ist, anderenfalls möchte ich meinen eigenen Komparator angeben.

Gibt es einen alternativen Weg dies zu tun, während die Typ-Sicherheit zur Kompilierzeit beibehalten wird?

public class ExampleClass<T, U> { 
    [...] 

    public <E extends T & Comparable<T>> ExampleClass(Function<U, E> function) { 
    this.function = function; 
    this.comparator = (E a, E b) -> a.compareTo(b); 
    } 

    public ExampleClass(Function<U, T> function, Comparator<U> comparator) { 
    this.function = function; 
    this.comparator = comparator; 
    } 

} 

Antwort

3

Sie können Ihr Problem lösen, indem Sie den ersten Konstruktor als statische Methode implementieren, die Delegierten zu Ihrem zweiten Konstruktor, wie folgt aus:

import java.util.Comparator; 
import java.util.function.Function; 

public class Test<T,U> { 
    private final Function<U,T> function; 
    private final Comparator<T> comparator; 

    public Test(Function<U,T> function, Comparator<T> comparator) { 
    this.function = function; 
    this.comparator = comparator; 
    } 

    public static <E extends Comparable<E>, V> Test<E,V> withNatOrder(Function<V,E> function) { 
     // Any of these two will do 
     final Comparator<E> comp = (E a, E b) -> a.compareTo(b); 
     final Comparator<E> comp2 = Comparator.naturalOrder(); 
     return new Test<>(function, comp); 
    } 
} 

Die statische Funktion keinen Zugriff auf die Klassentyp Parameter hat T und U, so definiert es neue, unabhängige. Der Rückgabetyp ist jetzt Test<E,V>, wobei E Vergleichbar implementiert und V wie Ihr U-Parameter unbegrenzt ist.

+0

Schöner Tipp mit dem 'Comparator.naturalOrder();'! –