Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型类型的可比实现?_Java_Oop_Generics_Comparable - Fatal编程技术网

Java 泛型类型的可比实现?

Java 泛型类型的可比实现?,java,oop,generics,comparable,Java,Oop,Generics,Comparable,我目前正在实施一个定制供应商,该供应商需要实施一个可比较的标准 因为我的类实现了Comparable,所以我必须自己实现compareTo()。但是,作为泛型类型,如何比较这些值?因为它们几乎可以是任何东西 class CachedSupplier<T> implements Comparable<T>{ private Supplier<? extends T> supplier; private T value; boolean i

我目前正在实施一个定制供应商,该供应商需要实施一个可比较的标准

因为我的类实现了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);
    }
}
class CachedSupplier实现了可比较的{

私人供应商您可以要求
T
实施
可比

编辑:正如Andreas评论的那样,如果您的
CachedSupplier
必须实现
Compariable
,则它可能应该实现
Compariable
而不是
Compariable

class CachedSupplier实现了可比较的
{

私人供应商您可以要求
T
实施
可比

编辑:正如Andreas评论的那样,如果您的
CachedSupplier
必须实现
Compariable
,则它可能应该实现
Compariable
而不是
Compariable

class CachedSupplier实现了可比较的
{

私人供应商类型应与自身(自身)具有可比性,这就是为什么您有
T extensed Comparable
,即
Comparable
类型参数是扩展
Comparable
的类型。这也意味着
CachedSupplier
必须实现
Comparable
,但SELF是
CachedSupplier
,而不是
T
。这就使得方法
比较(CachedSupplier o)
,允许您正确实现该方法,因此它实际上将
此.value
o.value
进行比较(通过
get()
间接用于延迟加载)。在我使用CachedSupplier的主类中,我应该如何声明它?它当前是:private CachedSupplier supplier;(但不起作用)。现在应该是什么类型?我尝试了private CachedSupplier supplier;但没有work@Iva您应该决定实例化它的类型。例如
CachedSupplier doubleSupplier=new CachedSupplier(Math::random);
CachedSupplier longSupplier=new CachedSupplier(System::currentTimeMillis);
@Eran但它必须是泛型类型,因为我正在SpecialStream(也是自定义编码的)中实现CachedSupplier,其中一个变量是我创建的CachedSupplier。@Iva要实例化
CachedSupplier
,必须向其传递一些
供应商
实例,因此必须选择供应商
生成的对象类型。类型应与自身(自身)具有可比性,这就是为什么您有
T extensed Comparable
,即
Comparable
类型参数是扩展
Comparable
的类型。这也意味着
CachedSupplier
必须实现
Comparable
,但SELF是
CachedSupplier
,而不是
T
。这就使得方法
比较(CachedSupplier o)
,允许您正确实现该方法,因此它实际上将
此.value
o.value
进行比较(通过
get()
间接用于延迟加载)。在我使用CachedSupplier的主类中,我应该如何声明它?它当前是:private CachedSupplier supplier;(但不起作用)。现在应该是什么类型?我尝试了private CachedSupplier supplier;但没有work@Iva您应该决定实例化它的类型。例如
CachedSupplier doubleSupplier=new CachedSupplier(Math::random);
CachedSupplier longSupplier=new CachedSupplier(System::currentTimeMillis);
@Eran但它必须是泛型类型,因为我正在SpecialStream(也是自定义编码的)中实现CachedSupplier,其中一个变量是我创建的CachedSupplier。@Iva要实例化
CachedSupplier
,必须向其传递一些
供应商
实例,因此必须选择供应商
生成的对象类型。
class CachedSupplier<T extends Comparable<T>>
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);
    }
}
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());
    }
}