What is the equivalent of the C# 'var' keyword in Java?

One use of the var keyword in C# is implicit type declaration. What is the Java equivalent syntax for var?


There is none. Alas, you have to type out the full type name.

Edit 6 years after being posted, to collect some of the comments from below:

  • The reason C# has the var keyword is because it's possible to have Types that have no name in .NET. Eg:

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

    In this case, it would be impossible to give a proper type to myData . 6 years ago, this was impossible in Java (all Types had names, even if they were extremely verbose and unweildy). I do not know if this has changed in the mean time.

  • var is not the same as dynamic . var iables are still 100% statically typed. This will not compile:

    var myString = "foo";
    myString = 3;
    
  • var is also useful when the type is obvious from context. For example:

    var currentUser = User.GetCurrent();
    

    I can say that in any code that I am responsible for, currentUser has a User or derived class in it. Obviously, if your implementation of User.GetCurrent return an int, then maybe this is a detriment to you.

  • This has nothing to do with var , but if you have weird inheritance hierarchies where you shadow methods with other methods (eg new public void DoAThing() ), don't forget that non-virtual methods are affected by the Type they are cast as.

    I can't imagine a real world scenario where this is indicative of good design, but this may not work as you expect:

    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
    

    As indicated, virtual methods are not affected by this.

  • No, there is no non-clumsy way to initialize a var without an actual variable.

    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
    

    In this case, just do it the old fashioned way:

    object foo6;
    

  • If you add Lombok to your project you can use its val keyword.

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


    JEP - JDK Enhancement-Proposal

    http://openjdk.java.net/jeps/286

    JEP 286: Local-Variable Type Inference

    Author Brian Goetz

    // Goals:
    var list = new ArrayList<String>();  // infers ArrayList<String>
    var stream = list.stream();          // infers Stream<String>
    
    链接地址: http://www.djcxy.com/p/2858.html

    上一篇: Node.js module.exports的用途是什么?你如何使用它?

    下一篇: Java中C#'var'关键字的等价物是什么?