Java Syntax Error: The method Foo is undefined for the type Bar

Java Syntax Error: The method Foo is undefined for the type Bar

我在 java 一本书中找到了这个,想了解为什么我会收到如下所述的错误:

public class Wildcard<V> {

    V value;

    public Wildcard(V value) {
        super();
        this.value = value;
    }

    public V getValue() {
        return value;
    }

    public void setValue(V value) {
        this.value = value;
    }

    public boolean sameObj(Wildcard<? extends V> v1, MyComparator<V> comparator) {
        return comparator.compare(this.value, v1.value);
    }

    public static void main(String[] args) {

        Wildcard<Integer> iTest = new Wildcard<Integer>(10);
        Wildcard<Number> nTest = new Wildcard<Number>(10);
        nTest.sameObject(iTest, new MyComparator<Number>() {
            public boolean compare(Number o1, Number o2) {
                return o1 == o2;
            }
        });
    }
}

interface MyComparator<V> {
    public boolean compare (V value,V value2) ;
}

nTest.sameObject行出现的语法错误是:

The method sameObject(Wildcard<Integer>, new MyComparator<Number>(){}) is undefined for the type Wildcard<Number>

由于在 class Wildcard 上调用方法 NumbersameObject 函数的第一个参数可以是扩展 V 的任何参数(在本例中为数字),接下来出现的函数的参数应为 V(在本例中为数字)。因此,它应该是一个合法的电话。为什么不是合法调用?

这可能是一个错字。 sameObj != sameObject.

正如 col6y 指出的那样,您应该将 sameObj 方法重命名为 sameObject

作为进一步的改进,我建议您将方法的签名更改如下

public boolean sameObject(Wildcard<? extends V> v1, MyComparator<? super V> comparator)

然后遵循PECS(producer extends, consumer super)规则。在那种特定情况下,这使您能够使用为超类型 V.

设计的比较器调用方法 sameObject

有关 PECS 的更多信息,您可以阅读 Joshua Bloch 的 Effective Java,或快速浏览 SO 上的 this question