Одним из вариантов использования ключевого слова var в C # является неявное объявление типа. Каков эквивалентный синтаксис Java для var ?
Не существует. Увы, приходится вводить полное имя типа.
Edit: 7 лет спустя после публикации, в Java 10 был добавлен вывод типов для локальных переменных (с var
).
Edit: 6 лет после публикации, чтобы собрать некоторые комментарии снизу:
Причина, по которой в C# есть ключевое слово var
, заключается в том, что в .NET можно иметь типы без имени. Например:
var myData = new { a = 1, b = "2" }
В этом случае было бы невозможно задать соответствующий тип для myData
. 6 лет назад в Java это было невозможно (все типы имели имена, даже если они были чрезвычайно многословны и неудобны). Я не знаю, изменилось ли это за прошедшее время.
var
- это не то же самое, что dynamic
. var
iables по-прежнему на 100% статически типизированы. Это не будет компилироваться:
var myString = "foo";
myString = 3;
var
также полезен, когда тип очевиден из контекста. Например:
var currentUser = User.GetCurrent();
Я могу сказать, что в любом коде, за который я отвечаю, currentUser
имеет User
или производный класс. Очевидно, что если ваша реализация User.GetCurrent
возвращает int, то, возможно, это вредит вам.
Это не имеет отношения к var
, но если у вас странные иерархии наследования, где вы затеняете методы другими методами (например, new 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, а не Bar.Non
foo.Virt(); // <- Bar.Virt
var bar = (Bar)foo;
bar.Non(); // <- Bar.Non, не Foo.Non
bar.Virt(); // <- все еще Bar.Virt
Как указано, на виртуальные методы это не влияет.
Нет, не существует неуклюжего способа инициализировать var
без фактической переменной.
var foo1 = "bar"; //хорошо
var foo2; //плохо, какой тип?
var foo3 = null; //плохо, у null нет типа
var foo4 = default(var); //что?
var foo5 = (object)null; //законно, но иди домой, ты пьян
В этом случае просто сделайте все по старинке:
object foo6;