Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是C#&x27的等价物;var';Java中的关键字?_Java_Keyword_Var - Fatal编程技术网

什么是C#&x27的等价物;var';Java中的关键字?

什么是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中是不可能的(所有类型都有名称,即使它们非常冗长和不合适)。

C#中var关键字的一个用法是隐式类型声明。var的Java等价语法是什么?

没有。唉,您必须键入完整的类型名称

编辑:发布7年后,Java10中增加了局部变量的类型推断(带有
var

编辑:发布6年后,收集以下评论:

  • C#之所以有
    var
    关键字,是因为在.NET中可能有没有名称的类型。例如:

    var myData = new { a = 1, b = "2" };
    
    在这种情况下,不可能为
    myData
    指定正确的类型。6年前,这在Java中是不可能的(所有类型都有名称,即使它们非常冗长和不合适)。我不知道这是否在同一时间发生了变化

  • var
    dynamic
    不同<代码>变量变量仍然是100%静态类型。这将不会编译:

    var myString = "foo";
    myString = 3;
    
  • var
    在类型从上下文中明显可见时也很有用。例如:

    var currentUser = User.GetCurrent();
    
    我可以说,在我负责的任何代码中,
    currentUser
    都有一个
    User
    或派生类。显然,如果
    User.GetCurrent
    的实现返回一个int,那么这可能对您不利

  • 这与
    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;
    

如果将Lombok添加到项目中,则可以使用其val关键字


我为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);