Сравнимая реализация для универсального типа? - PullRequest
1 голос
/ 05 ноября 2019

В настоящее время я реализую собственного Поставщика, который требует реализации Comparable.

Поскольку мой класс реализует Comparable, я должен сам реализовать compareTo (). Тем не менее, будучи универсальным типом, как я могу сравнить значения? Как они могут быть почти все.

class CachedSupplier<T> implements Comparable<T>{
    private Supplier<? extends T> supplier;
    private T value;
    boolean isAvailable;

    public CachedSupplier(Supplier<? extends T> supplier) {
        this.supplier = supplier;
    }

    public T get() {
        if (!isAvailable) {
            value = supplier.get();
            isAvailable = true;
        }
        return value;
    }

    public int compareTo(T o) {
        return get().compareTo(o);
    }
}

1 Ответ

3 голосов
/ 05 ноября 2019

Вы можете потребовать, чтобы T реализовал Comparable<T>:

class CachedSupplier<T extends Comparable<T>>

Теперь, если вам все еще нужен CachedSupplier для реализации Comparable<T> (что я не уверен, что вы делаете), вы можете использовать T compareTo() метод:

class CachedSupplier<T extends Comparable<T>> implements Comparable<T>
{
    private Supplier<? extends T> supplier;
    private T value;
    boolean isAvailable;

    public CachedSupplier(Supplier<? extends T> supplier) {
        this.supplier = supplier;
    }

    public T get() {
        if (!isAvailable) {
            value = supplier.get();
            isAvailable = true;
        }
        return value;
    }

    public int compareTo(T o) {
        return get().compareTo(o);
    }
}

РЕДАКТИРОВАТЬ: Как прокомментировал Андреас, если ваш CachedSupplier должен реализовать Comparable, он, вероятно, должен реализовать Comparable<CachedSupplier<T>> не Comparable<T>:

class CachedSupplier<T extends Comparable<T>> implements Comparable<CachedSupplier<T>>
{
    private Supplier<? extends T> supplier;
    private T value;
    boolean isAvailable;

    public CachedSupplier(Supplier<? extends T> supplier) {
        this.supplier = supplier;
    }

    public T get() {
        if (!isAvailable) {
            value = supplier.get();
            isAvailable = true;
        }
        return value;
    }

    public int compareTo(CachedSupplier<T> o) {
        return get().compareTo(o.get());
    }
}
...