什么是C#&x27的等价物;var';Java中的关键字?
C#中var关键字的一个用法是隐式类型声明。var的Java等价语法是什么?没有。唉,您必须键入完整的类型名称 编辑:发布7年后,Java10中增加了局部变量的类型推断(带有什么是C#&x27的等价物;var';Java中的关键字?,java,keyword,var,Java,Keyword,Var,C#中var关键字的一个用法是隐式类型声明。var的Java等价语法是什么?没有。唉,您必须键入完整的类型名称 编辑:发布7年后,Java10中增加了局部变量的类型推断(带有var) 编辑:发布6年后,收集以下评论: C#之所以有var关键字,是因为在.NET中可能有没有名称的类型。例如: var myData = new { a = 1, b = "2" }; 在这种情况下,不可能为myData指定正确的类型。6年前,这在Java中是不可能的(所有类型都有名称,即使它们非常冗长和不合适)。
var
)
编辑:发布6年后,收集以下评论:
- C#之所以有
关键字,是因为在.NET中可能有没有名称的类型。例如:var
在这种情况下,不可能为var myData = new { a = 1, b = "2" };
指定正确的类型。6年前,这在Java中是不可能的(所有类型都有名称,即使它们非常冗长和不合适)。我不知道这是否在同一时间发生了变化myData
与var
不同<代码>变量变量仍然是100%静态类型。这将不会编译:dynamic
var myString = "foo"; myString = 3;
在类型从上下文中明显可见时也很有用。例如:var
我可以说,在我负责的任何代码中,var currentUser = User.GetCurrent();
都有一个currentUser
或派生类。显然,如果User
的实现返回一个int,那么这可能对您不利User.GetCurrent
- 这与
无关,但是如果您有奇怪的继承层次结构,其中使用其他方法(例如var
)对方法进行阴影处理,请不要忘记非虚拟方法受其强制转换为的类型的影响 我无法想象现实世界中的场景,在这种场景中,这表明了良好的设计,但这可能不会如您所期望的那样起作用:new public void DoAThing()
在这种情况下,只需按传统方式进行:class Foo { public void Non() {} public virtual void Virt() {} } class Bar : Foo { public new void Non() {} public override void Virt() {} } class Baz { public static Foo GetFoo() { return new Bar(); } } var foo = Baz.GetFoo(); foo.Non(); // <- Foo.Non, not Bar.Non foo.Virt(); // <- Bar.Virt var bar = (Bar)foo; bar.Non(); // <- Bar.Non, not Foo.Non bar.Virt(); // <- Still Bar.Virt
object foo6;
我为IntelliJ制作了一个插件,它在某种程度上为您提供了Java中的
var
。这是一个黑客攻击,所以通常的免责声明适用,但是如果您在Java开发中使用IntelliJ并想尝试它,那么它就是。一个简单的解决方案(假设您使用的是一个像样的IDE)就是在任何地方键入“int”,然后让它为您设置类型
实际上,我刚刚添加了一个名为“var”的类,所以我不必键入其他内容
代码仍然太冗长,但至少您不必键入它 我知道这比较旧,但是为什么不创建一个var类并创建不同类型的构造函数呢?根据调用的构造函数的不同,可以得到不同类型的var。您甚至可以内置方法将一种类型转换为另一种类型 您可以通过JetBrains查看,但它是val.而不是var.JEP-JDK增强方案 JEP286:局部变量类型推断 作者布莱恩·戈茨
// Goals:
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
//目标:
var list=new ArrayList();//推断ArrayList
var stream=list.stream();//推断溪流
但它仍然被归类为实验性的:
import lombok.experimental.var;
var number = 1; // Inferred type: int
number = 2; // Legal reassign since var is not final
number = "Hi"; // Compilation error since a string cannot be assigned to an int variable
System.out.println(number);
在IntelliJ IDEA
中尝试使用它时要避免的陷阱。它看起来像预期的那样工作,尽管包括自动完成和一切。除非有“非黑客”解决方案(例如,由于),否则这可能是您目前的最佳选择
请注意,
val
也受Lombok
的支持,无需修改或创建Lombok.config
,JDK 10将支持它。甚至可以在未来看到它的实际应用
委员会:
增强Java语言,将类型推断扩展到带有初始值设定项的局部变量声明
所以现在不要写了:
List<> list = new ArrayList<String>();
Stream<> stream = myStream();
Java10确实得到了局部变量类型推断,所以现在它有了
var
,这与C#one(据我所知)相当
它还可以推断不可表示的类型(程序员无法在该位置命名的类型;尽管不可表示的类型不同)。见例
我能发现的一个区别是,在C#中
Java 10中的
var
不是一个合法的类型名称。随着JDK 10于3月20日发布,Java现在包括了中指定的var
保留类型名称(不是关键字,请参见下文)。对于局部变量,以下内容现在在Java 10或更高版本中有效:
var map = new HashMap<String, Integer>();
如JEP286所述:
这种处理方法仅限于局部变量
初始值设定项、增强for循环中的索引以及中声明的局部变量
传统的for循环;它不适用于方法形式,
构造函数形式、方法返回类型、字段、捕获形式或
任何其他类型的变量声明
Java和C中var
之间的差异
这是C#中的var
与Java之间的一个显著区别,包括:var
可以用作C#中的类型名,但不能用作Java中的类名或接口名。根据报告:
如果名为var
的类型在范围内,则var
关键字将解析为
该类型名称,并且不会被视为隐式类型化
局部变量声明
在C#中使用
var
作为类型名的能力会产生一些复杂性,并引入一些复杂的解析规则,Java中var
通过禁止var
作为类或接口名来避免这些规则。有关C#中var
类型名称复杂性的信息,请参阅。有关Java中'var'的作用域决定背后的基本原理的更多信息,请参阅。通常,您可以对任何类型使用对象类,但以后必须进行类型转换
例如:
Object object = 12;
Object object1 = "Aditya";
Object object2 = 12.12;
System.out.println(Integer.parseInt(object.toString()) + 2);
System.out.println(object1.toString() + " Kumar");
System.out.println(Double.parseDouble(object2.toString()) + 2.12);
从Java10开始,等价物是<代码>变量 此功能现在在JavaSE10中可用。静态的、类型安全的var终于进入了java世界:)
来源:您可以,在Java 10中,但仅限于本地
$ docker run -it marounbassam/ubuntu-java10 bash
root@299d86f1c39a:/# jdk-10/bin/jshell
Mar 30, 2018 9:07:07 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
| Welcome to JShell -- Version 10
| For an introduction type: /help intro
jshell> var list = new ArrayList<String>();
list ==> []
var map = new HashMap<String, Integer>();
var i = 0;
var var = 1;
for (var i = 0; i < 10; i++) { /* ... */ }
public int var() { return 0; }
package var;
Object object = 12;
Object object1 = "Aditya";
Object object2 = 12.12;
System.out.println(Integer.parseInt(object.toString()) + 2);
System.out.println(object1.toString() + " Kumar");
System.out.println(Double.parseDouble(object2.toString()) + 2.12);