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

标签 java generics

所以我想这样做:

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 给了我警告:

Type safety: The method compareTo(Object) belongs to the raw type Comparable. References to generic type Comparable should be parameterized

所以我把它变成了:

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

由于以下原因无法编译:

The method compareTo(capture#1-of ?) in the type Comparable is not applicable for the 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);       
    }
}

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

关于java generics - Comparable<capture#1-of ?> 类型中的方法compareTo(capture#1-of ?) 不适用于参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5872251/

相关文章:

java - 如何在不阻塞 UI 的情况下在屏幕上显示值并使其在 Android Activity 中以样式淡出?

java - 无法通过 Java VM 选项配置 JNDI 读取和连接超时属性

java - 将附加参数从 JSF 传递到 EJB

java - 如何正确使用泛型类型的数组?

java - 用所有东西制作一个 .jar 有什么意义?

Java枚举和循环问题

swift - 使 Vapor API 响应符合 JSON API 规范

java - 如何初始化包含泛型的泛型数组?

java - 为什么从接口(interface)执行方法时会将参数转换为 Object(或扩展 YourObject)?

c++ - 数组迭代器中的 hasNext() 方法