Java语法错误:类型Bar的方法Foo未定义

时间:2015-03-29 21:46:03

标签: java generics

我在一本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>

由于在使用Wildcard参数化的类Number上调用该方法,因此sameObject函数的第一个参数可以是扩展V的任何内容(在这种情况下为数字)并且接下来出现的函数的参数应为V(在这种情况下为数字)。因此,它应该是一个合法的电话。为什么不是合法的电话?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

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

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

然后遵循 PECS (生产者扩展,消费者超级)规则。在这种特定情况下,这使您能够使用专为超级sameObject设计的比较器调用方法V

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