どのようにしてJavaの変数型を知っていますか?


152

変数を宣言するとしましょう:

String a = "test";

そして、私はそれがどのタイプであるかを知りたい、すなわち、出力はjava.lang.Stringどのようにすべきですか?


1
変数型に本当に興味がありますか?または、値タイプを気にしますか?変数の型を簡単に取得できないためです(実際、ローカル変数ではまったく不可能であり、フィールドのリフレクションが必要です)。
ヨアヒムザウアー

8
@Paul:考慮Object o = "o";-変数のタイプはObject、値のタイプはStringです。
Michael Borgwardt 2010

2
@PaulではList<String> l = new ArrayList<String>();、変数List<String>のタイプは、値のタイプはArrayList<String>です。
Ben Lings、2010

1
@Ben Lings変数のタイプはjava.util.ArrayListで、値のタイプはjava.util.ArrayListです。
Ajay Takur 2013年

1
@AjayThakur-コンパイル時(静的)型とランタイム(動的)型の違いです。
Ben Lings 2013年

回答:


269
a.getClass().getName()

16
これにより、値のタイプがわかります。必ずしも変数の型ではありません。
Joachim Sauer、

7
aコンパイル時の宣言がかなり明白なので、私はそれがOPが本当に探していたものだと思ったところです
Martin

4
タイプがプリミティブでない場合、それは機能します...タイプがintの場合、タイプをどのように知ることができますか?
ミゲルリベイロ

5
@Miguel:int値を処理できる唯一の方法はint変数内にあるため、int値を処理し、その型を知らないコードを記述する方法ありません。問題はのようなラッパーを処理している場合は異なりますがInteger、この回答のコードは再び機能します。
ヨアヒムザウアー

1
これはプリミティブ型には当てはまりません。
Mehdi、2015

37

名前が必要な場合は、Martinの方法を使用します。特定のクラスのインスタンスかどうかを知りたい場合:

boolean b = a instanceof String


15
あなたもマーティンじゃないの?:)
ソクンリー

他のマーティン... LOL;)
chankruze

ThicコードDouble a = 1d; boolean b = a instanceof String;はエラーの原因になりますerror: incompatible types: Double cannot be converted to String
Alex78191

35

そこでマーティンの答えを拡大したいと思います...

彼の解決策はかなりいいですが、任意の「変数の型」はそのように印刷することができるので、それを微調整することができます。(それは、実際に値タイプだトピックの詳細)。そうは言っても、「微調整された」というのはこれを強く意味する言葉かもしれません。とにかく、それは役立つかもしれません。

Martinsソリューション:

a.getClass().getName()

ただし、何かを操作したい場合は、次のようにします。

((Object) myVar).getClass().getName()
//OR
((Object) myInt).getClass().getSimpleName()

この場合、プリミティブは単にラッパーでラップされます。その場合、プリミティブのオブジェクトを取得します。

私自身は次のように使用しました:

private static String nameOf(Object o) {
    return o.getClass().getSimpleName();
}

ジェネリックスの使用:

public static <T> String nameOf(T o) {
    return o.getClass().getSimpleName();
}

面白い。私はあなたのコードを試してみました:System.out.println(((Object)Integer.parseInt( "12")).getClass()。getSimpleName()); そしてそれはうまくいきます!\ o /
シェビー

31

私は検索エンジンから学びました(私の英語はとても悪いので、コードを記述してください...)変数の型を取得するには UPS :

String str = "test";
String type = str.getClass().getName();
value: type = java.lang.String

この方法 :

str.getClass().getSimpleName();
value:String

今の例:

Object o = 1;
o.getClass().getSimpleName();
value:Integer

3

私のヨアヒム・ザウアーが言ったことに同意しますが、変数がクラス属性でない限り(変数タイプ!値タイプではありません!)知ることができません(そして、クラスフィールドを取得し、名前で正しいフィールドを取得する必要があります...)

実は私にとっては、 a.xxx().yyy()メソッドもあなたに正しい答えを与えることはなぜなら、このメソッドを呼び出すコンテキストによって、まったく同じオブジェクトでは答えが異なるからです...

teehooが言ったように、テストする型の定義済みリストをコンパイルするときにわかっている場合は、instanceofを使用できますが、サブクラスがtrueを返すことにもなります...

可能な解決策の1つは、実装からインスピレーションjava.lang.reflect.Fieldを得て、独自のソリューションを作成することでもあります。Fieldクラスのクラスすべてのローカル変数をこのカスタムField実装として宣言することです...しかし、別の解決策を見つけた方がいいです。タイプだけでなく、値タイプ?


「しかし、あなたはまた、真を返すサブクラスを取得します...」、私はあなたが意味するものだと思う「しかし、あなたはまた、真を返す親クラスを取得します...」、右?
skomisa

3

Javaのオペレーターオーバーロード機能を使用する

class Test {

    void printType(String x) {
        System.out.print("String");
    }

    void printType(int x) {     
        System.out.print("Int");
    }

    // same goes on with boolean,double,float,object ...

}

8
Javaには演算子のオーバーロードの概念がありません。これはメソッドのオーバーロードです
nicoschl

2

ここには複数の解決策があると思います:

  • のインスタンスがソリューションである可能性があります。

どうして?Javaでは、すべてのクラスはObjectクラス自体から継承されます。したがって、変数があり、その型を知りたい場合。使用できます

  • System.out.println(((Object)f).getClass()。getName());

または

  • Integer.class.isInstance(1985); //真となる

または

  • isPrimitive()

    public static void main(String[] args) {
    
     ClassDemo classOne = new ClassDemo();
     Class classOneClass = classOne();
    
     int i = 5;
     Class iClass = int.class;
    
     // checking for primitive type
     boolean retval1 = classOneClass.isPrimitive();
     System.out.println("classOneClass is primitive type? = " + retval1);
    
     // checking for primitive type?
     boolean retval2 = iClass.isPrimitive();
     System.out.println("iClass is primitive type? = " + retval2);
    }

これは私たちに与えることになるでしょう:

詳細はこちら: プリミティブ変数のプリミティブ型を判別する方法は?

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

http://docs.oracle.com/cd/E26806_01/wlp.1034/e14255/com/bea/p13n/expression/operator/Instanceof.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.