【问题标题】:java generics - The method compareTo(capture#1-of ?) in the type Comparable<capture#1-of ?> is not applicable for the argumentsjava generics - Comparable<capture#1-of ?> 类型中的方法 compareTo(capture#1-of ?) 不适用于参数
【发布时间】:2023-04-04 10:57:01
【问题描述】:

所以我想这样做:

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) 属于 raw 类型可比。对泛型的引用 类型 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);       
    }
}

由于以下原因无法编译:

方法 compareTo(capture#1-of ?) 在 Comparable 类型中 不适用于论点 (可比)

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

【问题讨论】:

    标签: java generics


    【解决方案1】:

    目前您无法保证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);       
        }
    }
    

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

    【讨论】:

    • 我希望我可以避免 IFieldObject 的额外规范。它看起来像“老派”的 java 版本只是“工作”,它更紧凑,但我明白了。我真的更喜欢运行时错误而不是所有这些打字:)
    • 我觉得阅读泛型方法很方便的一种方法是:对于所有类型 T,get() 返回一个 Comparable
    • 让它变得更好,&lt;T extends Comparable&lt;? super T&gt;&gt;,使其适用于可比较类型的子类
    【解决方案2】:

    这个怎么样?

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

    【讨论】:

    • 看起来不错!你能指出一个资源来解释“public Comparable> foo()”和“public Comparable foo()”之间的区别吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    相关资源
    最近更新 更多