2015-12-29 35 views
6

İlk sınır türünde bir parametre olduğunda ek sınır belirtmenin Java'da mümkün olmadığını biliyorum; ancak, kimsenin benzer bir şey yapmanın ve derleme zamanında güvenli tutmanın alternatif bir yolunu bilen var mı diye merak ediyordum. Aşağıda bir örnek verdim.İlk ciltleme tip parametresi olduğunda ek bir sınır belirtmenin alternatif bir yolu var mı?

Aşağıdaki kodda, atıfta bulunduğum şey şu şekildedir: <E extends T & Comparable<T>>. Bu durumda, T türünün karşılaştırılabilir olması durumunda, dahili karşılaştırıcıyı kullanmak istiyorum, aksi takdirde kendi karşılaştırıcımı belirtmek istiyorum.

Derleme zamanında tip güvenliğini korurken bunu yapmanın alternatif bir yolu var mı?

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

} 

cevap

3

Statik bir yöntem olarak ilk yapıcısı uygulayarak sorunu çözebilir bu gibi ikinci yapıcı delegelerinin: statik işlev sınıf tipi parametrelerine erişimi yok

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 ve U, yeni ve bağımsız olanları tanımlar. Dönüş tipi artık E'nin Karşılaştırılabilir ve V'nin U parametreniz gibi sınırsız olduğu Test<E,V>'dur.

+0

Comparator.naturalOrder(); 'ile güzel bir ipucu! –