C# でのvarキーワードの用途の 1 つは、暗黙的な型宣言です。varに相当するJavaの構文は何ですか?
15 に答える
なにもない。残念ながら、完全な型名を入力する必要があります。
編集:投稿から7年後var
、Java 10でローカル変数の型推論( with )が追加されました。
編集:投稿から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, 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;
プロジェクトに Lombok を追加すると、そのvalキーワードを使用できます。
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>
私は IntelliJ 用のプラグインを作成しました。これは、ある意味var
で Java を提供します。これはハックなので、通常の免責事項が適用されますが、Java 開発に IntelliJ を使用していて試してみたい場合は、https://bitbucket.org/balpha/varsityにあります。
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 ==> []
You can take a look to Kotlin by JetBrains, but it's val. not var.
Java 10 はローカル変数の型推論を取得したためvar
、C# のものとほとんど同じになります (私が知る限り)。
また、非表示可能型 (プログラマーがその場所で名前を付けることができなかった型。ただし、どの型が非表示可能かは異なります) を推論することもできます。たとえば、 Tricks with var
and anonymous classes (that you should never use at work) を参照してください。
私が見つけた唯一の違いは、C# では、
var という名前の型がスコープ内にある場合、var キーワードはその型名に解決され、暗黙的に型指定されたローカル変数宣言の一部として扱われません。
Java 10var
では、正当な型名ではありません。