繁体   English   中英

java generics - Comparable 类型中的方法 compareTo(capture#1-of?)<capture#1-of ?> 不适用于 arguments</capture#1-of>

[英]java generics - The method compareTo(capture#1-of ?) in the type Comparable<capture#1-of ?> is not applicable for the arguments

所以我想这样做:

public interface IFieldObject {
    public Comparable get();
}

public interface IFieldCondition {
    public boolean apply(IFieldObject field, Comparable compare);
}

public class EqualTo implements IFieldCondition {
    public boolean apply(IFieldObject field, Comparable compare) {
        return (field.get().compareTo(compare) == 0);       
    }    
}

但是 Eclipse 给了我警告:

类型安全:方法 compareTo(Object) 属于原始类型 Comparable。 对泛型 Comparable 的引用应该被参数化

所以我把它变成了:

public interface IFieldObject {
    public Comparable<?> get();
}

public interface IFieldCondition {
    public boolean apply(IFieldObject field, Comparable<?> compare);
}

public class EqualTo implements IFieldCondition {
    public boolean apply(IFieldObject field, Comparable<?> compare) {
        return (field.get().compareTo(compare) == 0);       
    }
}

由于以下原因无法编译:

Comparable 类型中的 compareTo(capture#1-of?) 方法不适用于 arguments (Comparable)

这样做的正确方法是什么? (在惯用的 Java >= 1.6 之后没有警告)

目前,您无法保证field.get()返回的类型与方法指定的类型真正可比。 理想情况下,使整个事情通用,例如:

public interface IFieldObject<T extends Comparable<T>> {
    public T get();
}

public interface IFieldCondition<T> {
    public boolean apply(IFieldObject<T> field, Comparable<T> compare);
}

public class EqualTo<T> implements IFieldCondition<T> {
    public boolean apply(IFieldObject<T> field, Comparable<T> compare) {
        return (field.get().compareTo(compare) == 0);       
    }
}

毫无疑问,您可以使用额外的捕获使其更通用,但这是起点。

这个怎么样?

public interface IFieldObject {
    public<T> Comparable<T> get();
}

public interface IFieldCondition {
    public boolean apply(IFieldObject field, Comparable<?> compare);
}

public class EqualTo implements IFieldCondition {
    public boolean apply(IFieldObject field, Comparable<?> compare) {
        return (field.get().compareTo(compare) == 0);       
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM