Java 中的 C# 'var' 关键字等效项是什么?

2022-08-31 05:21:28

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


答案 1

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

编辑:发布7年后,在Java 10中添加了局部变量(with )的类型推断。var

编辑:发布6年后,从下面收集一些评论:

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

    var myData = new { a = 1, b = "2" };
    

    在这种情况下,不可能为 .6年前,这在Java中是不可能的(所有类型都有名称,即使它们非常冗长和不舒服)。我不知道这是否在此期间发生了变化。myData

  • var与 不同。iables仍然是100%静态类型的。这将不会编译:dynamicvar

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

    var currentUser = User.GetCurrent();
    

    我可以说,在我负责的任何代码中,都有一个或派生的类。显然,如果你的实现返回一个int,那么也许这对你是有害的。currentUserUserUser.GetCurrent

  • 这与 无关,但是如果您有奇怪的继承层次结构,其中您与其他方法(例如)隐藏方法,请不要忘记非虚方法受其强制转换的类型的影响。varnew 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
    

    如前所述,虚拟方法不受此影响。

  • 不,没有不笨拙的方法来初始化没有实际变量的 a。var

    var foo1 = "bar";        //good
    var foo2;                //bad, what type?
    var foo3 = null;         //bad, null doesn't have a type
    var foo4 = default(var); //what?
    var foo5 = (object)null; //legal, but go home, you're drunk
    

    在这种情况下,只需以老式的方式进行操作:

    object foo6;
    

答案 2

如果您将龙目岛添加到您的项目中,则可以使用其val关键字。

http://projectlombok.org/features/val.html