eclipse-jdt / eclipse-jdt/eclipse.jdt.core

Type cannot be inferred when local variable declared as var

Open
#1,793 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.