类型推断:泛型,"var"

rap*_*apt -1 java generics type-inference java-10

我认为Java编译器(Java 11)本身可以推断出实际的泛型类型,如果我给它足够的提示,例如当泛型类型是方法参数并且我作为参数提供实际类型的实例时.

例如,我有以下类:

public class Var<T>
{
    public T value;

    public Var(T value)
    {
        this.value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我尝试以下3次尝试,我希望所有人都能编译:

//(1) Compilation error!
Var v = new Var(0);
++v.value;

//(2) Compilation error!
Var v = new Var<Integer>(0);
++v.value;

//(3) Compiles!
Var<Integer> v = new Var(0);
++v.value;
Run Code Online (Sandbox Code Playgroud)

1)我希望(1)编译,因为通过使用Integer(或int)参数,编译器知道实际类型可能就足够了.所以++v.value;我希望编译器知道变量是一个Integer,但事实并非如此.它仍然认为它是一个Object.

2)添加一些显式信息.但编译器仍然无法理解.

3)按预期编译.

然后,我尝试使用var关键字进行类型推断:

//(4) Compilation error!
var v = new Var(0);
++v.value;

//(5) Compiles!
var v = new Var<Integer>(0);
++v.value;
Run Code Online (Sandbox Code Playgroud)

4)同样,我希望(4)编译,因为类型可以从参数中推断出来.

5)(纠正我的语法后:)按预期编译.

问题:

你能解释为什么这个代码在案例(1),(2),(4)中失败了吗?

有没有办法让var关键字类型推断与这样的类一起工作?

Pet*_*rey 7

我希望(1)编译,

这是一种原始类型,与写作类似

Var<Object> v = new Var<Object>();
Run Code Online (Sandbox Code Playgroud)

但是Object不支持 ++

这是基于class Var<T>这是简写所暗示的,class Var<T extends Object>所以如果你有一个原始类型,它假定类型T扩展.

添加一些显式信息.但编译器仍然无法理解.

代码无法编译我建议在正确的位置添加信息.

Var<Integer> v = new Var<>();
Run Code Online (Sandbox Code Playgroud)

要么

Var<Integer> v = new Var<Integer>();
Run Code Online (Sandbox Code Playgroud)

有没有办法让var关键字类型推断适用于这样的类

var只是一个简写,如果没有它,代码将无法工作,添加它将无济于事.