2015-12-29 12 views
6

最初の境界が型パラメータであるときに追加の境界を指定することはJavaでは不可能です。しかし、コンパイル時に誰かが同様のやり方をして安全に保つための別の方法を知っているかどうかは疑問でした。私は以下の例を提供しました。最初の境界が型パラメータの場合に、追加の境界を指定する別の方法はありますか?

次のコードでは、私が参照しているのは<E extends T & Comparable<T>>です。このような状況では、Tの型が匹敵する場合には、inbuiltコンパレータを使用できるようにしたい。そうでなければ、私自身のコンパレータを指定したい。

コンパイル時に型安全性を維持しながらこれを行う別の方法はありますか?

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; 
    } 

} 

答えて

3

あなたは静的メソッドとして最初のコンストラクタを実装することにより、あなたの問題を解決することができ、このような2番目のコンストラクタに委譲し、:静的関数はクラスの型パラメータにアクセスすることはできません

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); 
    } 
} 

TとUのように、独立した新しいものを定義します。戻り値の型はTest<E,V>になりました。ここでEはComparableを実装していますが、VはUパラメータと同様に無制限です。

+0

「Comparator.naturalOrder();」という素晴らしいヒント! –

関連する問題