【问题标题】:Comparable implementation for Generic Type?通用类型的可比实现?
【发布时间】:2019-11-05 12:22:02
【问题描述】:

我目前正在实施一个需要实施 Comparable 的自定义供应商。

由于我的班级实现了 Comparable,因此我必须自己实现 compareTo()。但是,作为 Generic Type ,我如何比较这些值?因为它们几乎可以是任何东西。

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

【问题讨论】:

    标签: java oop generics comparable


    【解决方案1】:

    您可以要求T 实现Comparable&lt;T&gt;

    class CachedSupplier<T extends Comparable<T>>
    

    现在,如果您仍然需要 CachedSupplier 本身来实现 Comparable&lt;T&gt;(我不确定您是否这样做),您可以使用 TcompareTo() 方法:

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

    编辑:正如 Andreas 评论的那样,如果您的 CachedSupplier 必须实现 Comparable,它可能应该实现 Comparable&lt;CachedSupplier&lt;T&gt;&gt; 而不是 Comparable&lt;T&gt;

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

    【讨论】:

    • 一个类型应该是Comparable和它自己(SELF),这就是为什么你有T extends Comparable&lt;T&gt;,即Comparable类型参数是扩展Comparable的类型。这也意味着CachedSupplier必须实现Comparable&lt;SELF&gt;,但SELF是CachedSupplier&lt;T&gt;,而不是T。然后生成方法compareTo(CachedSupplier&lt;T&gt; o),允许您正确实现该方法,因此它实际上将this.valueo.value 进行比较(间接通过get() 进行延迟加载)。
    • 在使用我的 CachedSupplier 的主类中,我应该如何声明它?目前是:私有 CachedSupplier 供应商; (但不起作用)。现在应该是什么类型?我试过私有 CachedSupplier> 供应商;没有用
    • @Iva 您应该决定使用哪种类型来实例化它。例如CachedSupplier&lt;Double&gt; doubleSupplier = new CachedSupplier&lt;&gt;(Math::random);CachedSupplier&lt;Long&gt; longSupplier = new CachedSupplier&lt;&gt;(System::currentTimeMillis);
    • @Eran 但它必须是通用类型,因为我在我的 SpecialStream 中实现了 CachedSupplier(也是自定义编码的),其中一个变量是我创建的 CachedSupplier。
    • @Iva 为了实例化CachedSupplier,您必须将一些Supplier 实例传递给它,因此您必须选择Supplier 生成的对象类型。
    猜你喜欢
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多