eclipse-jdt / eclipse-jdt/eclipse.jdt.core
Type cannot be inferred when local variable declared as var
- Dominant language
- Java
- Stars
- 237
- Forks
- 195
- Avg merge
- 1d 12h
- Merged PRs (30d)
- 47
Description
Originally reported as https://bugs.eclipse.org/bugs/show_bug.cgi?id=577882.
Consider the following UUIDGenerator class:
```
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
public class UUIDGenerator {
public UUID from(String uuidString) {
return UUID.fromString(uuidString);
}
public CompletableFuture generateFuture() {
return CompletableFuture.completedFuture(UUID.randomUUID());
}
}
```
And the following Main class:
```
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
UUIDGenerator uuidGenerator = new UUIDGenerator();
var uuidFuture = uuidGenerator.generateFuture();
var uuidFutureStream = CompletableFuture.completedStage("f5ee46c2-f515-4983-81aa-b4f3cd42752f")
.thenCombine(uuidFuture, (defaultUuidString, uuid) -> {
return Stream.of(CompletableFuture.completedFuture(uuidGenerator.from(uuid.toString())));
});
CompletionStage>> nonVarUuidFutureStream = uuidFutureStream;
}
}
```
JDT will happily compile all the above code. However, when you introduce a local variable for `CompletableFuture.completedFuture(uuidGenerator.from(uuid.toString()))` and declare it as `var`, JDT will no longer be able to infer the type and will treat `uuidFutureStream` as `CompletionStage>`:
```
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionStage;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
UUIDGenerator uuidGenerator = new UUIDGenerator();
var uuidFuture = uuidGenerator.generateFuture();
var uuidFutureStream = CompletableFuture.completedStage("f5ee46c2-f515-4983-81aa-b4f3cd42752f")
.thenCombine(uuidFuture, (defaultUuidString, uuid) -> {
var completedFuture = CompletableFuture.completedFuture(uuidGenerator.from(uuid.toString()));
return Stream.of(completedFuture);
});
CompletionStage>> nonVarUuidFutureStream = uuidFutureStream;
}
}
```
Contributor guide
Assessment
This issue has not been assessed yet.