JochenW
JochenW

Reputation: 1053

When is the diamond operator, and when not?

Consider the following two lines of code:

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

To me, they look quite similar. However, the second line is refused by the Java compiler (1.8) with the message "Cannot infer type arguments for SimpleFileVisitor<>".

Can anyone please explain, what's the problem?

Upvotes: -1

Views: 156

Answers (1)

Matteo NNZ
Matteo NNZ

Reputation: 12645

I don't see how you may get the error message Cannot infer type arguments because your syntax is correct, except for the fact that as many have said already, the class java.nio.file.SimpleFileVisitor has only one constructor which is protected:

protected SimpleFileVisitor() {
}

This means that only children of this class can initialize an instance of SimpleFileVisitor, and that's why your code doesn't compile.

I don't know this class, but by a quick look at the code I guess they simply expect you to extend it first (or use an already existing extension coming from somewhere else), and then use it the implementations of the FileVisitor interface.

If you don't have a concrete child class to use and want to create your own MySimpleFileVisitor:

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

... you will then be able to instantiate your class and use the already implemented methods like this:

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

Upvotes: 0

Related Questions