繁体   English   中英

类型推断:泛型,“var”

[英]Type inference: Generics, "var"

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

例如,我有以下课程:

public class Var<T>
{
    public T value;

    public Var(T value)
    {
        this.value = value;
    }
}

然后,我尝试了以下 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;

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;

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

5)(更正我的语法后:)按预期编译。

问题:

你能解释为什么这段代码在 (1)、(2)、(4) 的情况下失败吗?

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

我希望(1)能够编译,

这是一个原始类型,类似于写作

Var<Object> v = new Var<Object>();

但对象不支持++

这是基于class Var<T>隐含的,它是class Var<T extends Object>简写,所以如果你有一个原始类型,它假定类型T extends。

添加一些明确的信息。 但是编译器还是不明白。

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

Var<Integer> v = new Var<>();

或者

Var<Integer> v = new Var<Integer>();

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

var只是一个简写,如果没有它代码就不能工作,添加它也无济于事。

正确的语法是:

var v = new Var<Integer>(0);

new <Integer>Var(0)是使用泛型构造函数的晦涩语法(与泛型方法非常相似)。 你有一个泛型类型。

原始代码应该生成大量原始类型的警告消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM