Что такое эквивалент ключевого слова var в C # в Java?

Одним из вариантов использования ключевого слова var в C # является неявное объявление типа. Каков эквивалентный синтаксис Java для var ?

254
задан Peter Mortensen 7 February 2018 в 08:08
поделиться

1 ответ

Не существует. Увы, приходится вводить полное имя типа.

Edit: 7 лет спустя после публикации, в Java 10 был добавлен вывод типов для локальных переменных (с var).

Edit: 6 лет после публикации, чтобы собрать некоторые комментарии снизу:

  • Причина, по которой в C# есть ключевое слово var, заключается в том, что в .NET можно иметь типы без имени. Например:

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

    В этом случае было бы невозможно задать соответствующий тип для myData. 6 лет назад в Java это было невозможно (все типы имели имена, даже если они были чрезвычайно многословны и неудобны). Я не знаю, изменилось ли это за прошедшее время.

  • var - это не то же самое, что dynamic. variables по-прежнему на 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;
    
242
ответ дан 23 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: