275

C# でのvarキーワードの用途の 1 つは、暗黙的な型宣言です。varに相当するJavaの構文は何ですか?

4

15 に答える 15

261

なにもない。残念ながら、完全な型名を入力する必要があります。

編集:投稿から7年後var、Java 10でローカル変数の型推論( with )が追加されました。

編集:投稿から6年後、以下からコメントの一部を収集します:

  • C# にvarキーワードがある理由は、.NET では名前のない型を使用できるためです。例えば:

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

    この場合、 に適切な型を与えることは不可能myDataです。6 年前、これは Java では不可能でした (非常に冗長で扱いにくいものであっても、すべてのタイプに名前がありました)。これがその間に変化したかどうかはわかりません。

  • varと同じではありませんdynamicvariables はまだ 100% 静的に型付けされています。これはコンパイルされません:

    var myString = "foo";
    myString = 3;
    
  • varタイプがコンテキストから明らかな場合にも役立ちます。例えば:

    var currentUser = User.GetCurrent();
    

    私が担当しているコードにcurrentUserは、Userまたは派生クラスが含まれていると言えます。明らかに、あなたの実装がUser.GetCurrentintを返す場合、これはおそらくあなたにとって不利益です.

  • これは とは何の関係もありませんが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, not Bar.Non
    foo.Virt(); // <- Bar.Virt
    
    var bar = (Bar)foo;
    bar.Non();  // <- Bar.Non, not Foo.Non
    bar.Virt(); // <- Still Bar.Virt
    

    示されているように、仮想メソッドはこの影響を受けません。

  • varいいえ、実際の変数なしでa を初期化するための不器用な方法はありません。

    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;
    
于 2010-08-09T20:23:25.120 に答える
46

プロジェクトに Lombok を追加すると、そのvalキーワードを使用できます。

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

于 2010-12-14T19:25:47.917 に答える
27

JEP - JDK 拡張提案

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

JEP 286: ローカル変数の型推論

作者ブライアン・ゲッツ

// Goals:
var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>
于 2017-07-24T15:36:44.630 に答える
20

私は IntelliJ 用のプラグインを作成しました。これは、ある意味varで Java を提供します。これはハックなので、通常の免責事項が適用されますが、Java 開発に IntelliJ を使用していて試してみたい場合は、https://bitbucket.org/balpha/varsityにあります。

于 2013-04-14T18:10:11.023 に答える
11

JDK 10 でサポートされる予定です。アーリー アクセス ビルドで動作を確認することもできます。

JEP 286 :

Java 言語を拡張して、初期化子を使用してローカル変数の宣言に型推論を拡張します。

だから今書く代わりに:

List<> list = new ArrayList<String>();
Stream<> stream = myStream();

あなたが書く:

var list = new ArrayList<String>();
var stream = myStream();

ノート:

  • var予約済みの型名になりました
  • Java は依然として静的型付けに取り組んでいます。
  • ローカル変数宣言でのみ使用できます

ローカル システムに Java をインストールせずに試してみたい場合は、JDK 10 がインストールされたDocker イメージを作成しました。

$ docker run -it marounbassam/ubuntu-java10 bash
root@299d86f1c39a:/# jdk-10/bin/jshell
Mar 30, 2018 9:07:07 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
|  Welcome to JShell -- Version 10
|  For an introduction type: /help intro

jshell> var list = new ArrayList<String>();
list ==> []
于 2018-02-22T16:51:52.350 に答える
5

You can take a look to Kotlin by JetBrains, but it's val. not var.

于 2015-08-16T05:34:09.367 に答える
5

Java 10 はローカル変数の型推論を取得したためvar、C# のものとほとんど同じになります (私が知る限り)。

また、非表示可能型 (プログラマーがその場所で名前を付けることができなかった型。ただし、どの型が非表示可能かは異なります) を推論することもできます。たとえば、 Tricks with varand anonymous classes (that you should never use at work) を参照してください。

私が見つけた唯一の違いは、C# では、

var という名前の型がスコープ内にある場合、var キーワードはその型名に解決され、暗黙的に型指定されたローカル変数宣言の一部として扱われません。

Java 10varでは、正当な型名ではありません。

于 2018-03-29T14:00:56.630 に答える