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关键字类型推断与这样的类一起工作?
我希望(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只是一个简写,如果没有它,代码将无法工作,添加它将无济于事.