假设我有以下内容:
public interface Filter<E> {
public boolean accept(E obj);
}
和
import java.io.File;
import java.io.FilenameFilter;
public abstract class CombiningFileFilter extends javax.swing.filechooser.FileFilter
implements java.io.FileFilter, FilenameFilter {
@Override
public boolean accept(File dir, String name) {
return accept(new File(dir, name));
}
}
就目前而言,您可以使用 javac 来编译CombiningFileFilter. 但是,如果您还决定实现Filter<File>in CombiningFileFilter,则会收到以下错误:
CombiningFileFilter.java:9: error: reference to accept is ambiguous,
both method accept(File) in FileFilter and method accept(E) in Filter match
return accept(new File(dir, name));
^
where E is a type-variable:
E extends Object declared in interface Filter
1 error
但是,如果我参加第三节课:
import java.io.File;
public abstract class AnotherFileFilter extends CombiningFileFilter implements
Filter<File> {
}
不再有编译错误。Filter如果不是通用的,编译错误也会消失:
public interface Filter {
public boolean accept(File obj);
}
为什么编译器无法弄清楚,既然类实现Filter<File>了,那么accept方法实际上应该是accept(File)并且没有歧义?另外,为什么这个错误只发生在 javac 上?(它适用于 Eclipse 的编译器。)
/edit
对于这个编译器问题,比创建第三个类更简洁的解决方法是将public abstract boolean accept(File)方法添加到CombiningFileFilter. 这消除了歧义。
/e2
我使用的是 JDK 1.7.0_02。