8.10 Java中,C#里的'var'关键字的等效项是什么? | Java Debug 笔记

219 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

**提问:Java中,C#里的'var'关键字的等效项是什么? **

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

回答1:

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

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

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

1, C#之所以使用var关键字是因为.NET中可能有没有名称的Types。例如:

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

在这种情况下,不可能为myData赋予适当的类型。 6年前,这在Java中是不可能的(所有类型都有名称,即使它们非常冗长和笨拙)。 我不知道这是否同时发生了变化。

2, var与dynamic不同。 变量仍然是100%静态类型的。 这将无法编译:

var myString = "foo";
myString = 3;

3,即使当类型从上下文中显而易见时,var也很有用。 例如:

var currentUser = User.GetCurrent();

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

4,这与var无关,但是,如果您具有怪异的继承层次结构,在这些层次结构中您将方法与其他方法(例如,新的public void DoAThing())一起使用,请不要忘记非虚拟方法受它们转换为Type的影响。 。

我无法想象现实世界中的情况表明良好的设计,但这可能无法按您期望的那样工作:

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

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