The inferred type when using recursive type bounds is missing a more specific wildcard when looking at the definition of a variable (e.g. via hovering it). This works in IntelliJ, but not in VS Code.
VS Code:
Fruit<?>
IntelliJ:
Fruit<? extends Fruit<?>>
Environment
Operating System: macOS Sonoma 14
JDK version: 21.0.2
Visual Studio Code version: 1.94.2
Java extension version: v0.29.0
Steps To Reproduce
Here is a made-up example with two classes:
Fruit.java
public class Fruit<T extends Fruit<T>> implements Comparable<T> {
private final Integer size;
public Fruit(Integer size) {
this.size = size;
}
public Integer getSize() {
return size;
}
@Override public int compareTo(T other) {
return size.compareTo(other.getSize()); // Now getSize() is available.
}
}
Apple.java
class Apple extends Fruit<Apple> {
public Apple(Integer size) {
super(size);
}
}
Some random class/function to check:
public Fruit<? extends Fruit<?>> getFruit(Fruit<? extends Fruit<?>> someFruit) {
// in real world code, assume some mapper/runtime check here
// var someFruit = ...
return new Fruit<>(1);
}
Somewhere else:
var fruit = getFruit(new Apple(1));
Current Result
Fruit<?> (in the definition window)
Expected Result
Fruit<? extends Fruit<?>> (in the definition window)
The inferred type when using recursive type bounds is missing a more specific wildcard when looking at the definition of a variable (e.g. via hovering it). This works in IntelliJ, but not in VS Code.
VS Code:
Fruit<?>
IntelliJ:
Fruit<? extends Fruit<?>>
Environment
Steps To Reproduce
Here is a made-up example with two classes:
Fruit.java
Apple.java
Some random class/function to check:
Somewhere else:
Current Result
Fruit<?>
(in the definition window)Expected Result
Fruit<? extends Fruit<?>>
(in the definition window)