-1

考虑以下两行代码:

final List<Path> paths = new ArrayList<>();
final FileVisitor<Path> fv = new SimpleFileVisitor<>();

对我来说,它们看起来很相似。但是,Java 编译器 (1.8) 拒绝第二行并显示消息“无法推断 SimpleFileVisitor<> 的类型参数”。

谁能解释一下,有什么问题吗?

4

1 回答 1

0

我看不出你是如何得到错误消息Cannot infer type arguments的,因为你的语法是正确的,除了正如许多人已经说过的那样,这个类java.nio.file.SimpleFileVisitor只有一个构造函数,它是protected

protected SimpleFileVisitor() {
}

这意味着只有此类的子级才能初始化 的实例SimpleFileVisitor,这就是您的代码无法编译的原因。

我不知道这个类,但通过快速查看代码,我猜他们只是希望您先扩展它(或使用来自其他地方的现有扩展),然后使用它来实现FileVisitor接口。

如果您没有要使用的具体子类并想创建自己的MySimpleFileVisitor

public class MySimpleFileVisitor<T> extends SimpleFileVisitor<T> {
    public MySimpleFileVisitor() {
        super(); //<-- here you have the right to call the protected constructor of SimpleFileVisitor
    }
}

...然后您将能够实例化您的类并使用已经实现的方法,如下所示:

FileVisitor<Path> fv = new MySimpleFileVisitor<>(); //<-- here you will be able to correctly infer parameter type as you do in your List example
fv.visitFile(file, attrs); //<-- here you enter the method implemented inside SimpleFileVisitor
于 2021-06-29T10:47:28.020 回答