1. ホーム

[解決済み】C#の「var」キーワードに相当するJavaは何ですか?

2022-04-02 23:24:53

質問

の一つの使い方は ヴァル キーワードは暗黙の型宣言です。に相当するJavaの構文は何ですか? var ?

解決方法は?

ありません。残念ですが、完全な型名をタイプアウトする必要があります。

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

編集:投稿されてから6年、下からのコメントを集めるため。

  • C#が var キーワードは、.NETでは名前のないTypeを持つことが可能だからです。例えば

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

    この場合,適切な型は myData . 6年前、これはJavaでは不可能でした(すべてのTypeは、たとえそれが非常に冗長で野暮ったいものであったとしても、名前を持っていました)。この間に変わったかどうかはわかりません。

  • var とは異なります。 dynamic . var iableは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 を実際の変数なしで使用することができます。

    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;