[英]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.