Javaで変数のタイプを確認するにはどうすればよいですか?


120

変数がint、array、doubleなどであることを確認するにはどうすればよいですか?

編集:たとえば、変数が配列であることをどのように確認できますか?これを行う機能はありますか?


見てみましょうリフレクションAPI
mschonaker

ここに回答がある非常に関連のある質問:stackoverflow.com/questions/2674554/…
A.Alessio

回答:


111

Javaは静的に型付けされた言語であるため、コンパイラーはこのチェックのほとんどを行います。変数を特定のタイプであると宣言すると、コンパイラーは、そのタイプの値(またはそのタイプのサブタイプである値)のみが割り当てられるようにします。

あなたが与えた例(int、配列、double)これらはすべてプリミティブであり、それらのサブタイプはありません。したがって、変数をとして宣言すると、int次のようになります。

int x;

あなたはそれだけがint値を保持することを確認できます。

Listただし、変数をとして宣言した場合、変数がのサブタイプを保持する可能性がありますList。これらの例としてはArrayListLinkedListなど

あなたが持っていた場合はList、変数を、そしてあなたはそれがあったかどうかを知るために必要なArrayList、次の操作を行うことができます:

List y;
...
if (y instanceof ArrayList) { 
  ...its and ArrayList...
}

ただし、そうする必要があると思った場合は、アプローチを再考する必要があります。ほとんどの場合、オブジェクト指向の原則に従う場合、これを行う必要はありません。もちろん、すべてのルールには例外があります。


3
instanceof演算子は、変数によって参照されるオブジェクトのデータ型のみを決定します。最初に要求された実際のVARIABLEのデータ型は決定されません。
GrantRobertson 2016

38

実際、Javaのメソッドオーバーロード機能を悪用することにより、独自のテスターをロールするのは非常に簡単です。SDKに公式のメソッドがあるかどうかはまだ気になりますが。

例:

class Typetester {
    void printType(byte x) {
        System.out.println(x + " is an byte");
    }
    void printType(int x) {
        System.out.println(x + " is an int");
    }
    void printType(float x) {
        System.out.println(x + " is an float");
    }
    void printType(double x) {
        System.out.println(x + " is an double");
    }
    void printType(char x) {
        System.out.println(x + " is an char");
    }
}

次に:

Typetester t = new Typetester();
t.printType( yourVariable );

21
良い方法ではないIMO。Typetesterクラスで定義されていない任意の型を渡すとどうなりますか?たとえば、このインスタンスではStringですか?
Tash Pemhiwa 2013年

6
次に@TashPemhiwaは文字列とオブジェクトを選択肢に追加します。創造性と問題解決は、プログラマーにとって最高の資産です。
加藤

8
それでも、これは事前に定義されたクラスの固定セット(オブジェクト指向/多態性の目的に
反する)しか処理

3
実行時ではなく、コンパイル時に発生する署名の選択。したがって、この手法では、コンパイル時にまだわからないことは何もわかりません。 docs.oracle.com/javase/specs/jls/se7/html/...
JMH

26

a.getClass().getName()-によって参照される実際のオブジェクトaのデータ型を提供しますが、変数が使用するデータ型は提供しませんaがが最初に宣言された、またはその後キャストされ。

boolean b = a instanceof String-によって参照される実際のオブジェクトaが特定のクラスのインスタンスであるかどうかを示します。この場合も、変数aが最初に宣言された、またはその後キャストされたデータ型は、instanceof演算子の結果には影響しません。

私はこの情報を以下から取得しました: Javaの変数の型をどのようにして知っていますか?

これが起こる可能性があります。私はStringint を解析してint Integer.parseInt(s.substring(a, b))にしようとしています。合計する前に、intまたはガベージを追い出すかどうかを知りたいのですが。

ちなみに、これはリフレクションとして知られています。この件に関する詳細は次のとおりです。http//docs.oracle.com/javase/tutorial/reflect/


14

intの代わりにInteger、doubleの代わりにDoubleなどを使用できます(このようなクラスはすべてのプリミティブ型に存在します)。次に、演算子instanceofを使用できます。if(var instanceof Integer){...}


2
必要なのは有効なユースケースだけです。
ローン侯爵

最も効果的なアプローチのように聞こえます。
I.Tyger 2015年

13

ただ使用する:

.getClass().getSimpleName();

例:

StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());

出力:

StringBuilder

1
randSBNULLを保持している場合、これは機能しないことに注意してください。
バジルブルク2018

8

そうですね、変数の型のチェックはこの方法で実行できると思います。

public <T extends Object> void checkType(T object) {    
    if (object instanceof Integer)
        System.out.println("Integer ");
    else if(object instanceof Double)
        System.out.println("Double ");
    else if(object instanceof Float)
        System.out.println("Float : ");
    else if(object instanceof List)
        System.out.println("List! ");
    else if(object instanceof Set)
        System.out.println("Set! ");
}

この方法では、複数のオーバーロードされたメソッドを持つ必要はありません。追加の利点があるため、配列ではなくコレクションを使用することをお勧めします。そうは言っても、配列型をチェックする方法はわかりません。多分誰かがこの解決策を改善することができます。お役に立てれば!

PSはい、これはプリミティブもチェックしないことを知っています。


6

あなたの質問の最初の部分は無意味です。コンパイル時にプリミティブ変数のタイプがわからないという状況はありません。

2番目の部分については、変数が配列かどうかまだわからない唯一の状況は、それがオブジェクトである場合です。その場合object.getClass().isArray()は教えてくれます。


5
文字列からオブジェクトへのハッシュマップを作成し、そのハッシュマップにintを挿入して、それを引き出すことができます。私が知っている唯一のことは、それが「オブジェクト」であり、それがどのタイプかをチェックする必要があるかもしれないということです。良いと言っているのではなく、可能だと言っているだけです。
matty-d 2013


2

私はこれらの答えのどれにも満足していませんでした、そして正しい答えは説明も否定票もないので、私は周りを検索し、何かを見つけて、理解しやすいように編集しました。期待するほど簡単ではありません。

//move your variable into an Object type
Object obj=whatYouAreChecking;
System.out.println(obj);

// moving the class type into a Class variable
Class cls=obj.getClass();
System.out.println(cls);

// convert that Class Variable to a neat String
String answer = cls.getSimpleName();
System.out.println(answer);

ここにメソッドがあります:

public static void checkClass (Object obj) {
    Class cls = obj.getClass();
    System.out.println("The type of the object is: " + cls.getSimpleName());       
}

1

変数が初期化されていないジェネリック型の場合、これらの回答はどれも機能しません

そして私が見つけたものから、それは非常に醜い回避策を使用するか、初期化されたパラメーターを関数に渡してインプレースにすることによってのみ可能です、ここを参照してください:

<T> T MyMethod(...){ if(T.class == MyClass.class){...}}

タイプTは実行時に消去されるため、パラメーターから直接タイプをプルすることはできないため、無効です。

<T> void MyMethod(T out, ...){ if(out.getClass() == MyClass.class){...}}

これは、呼び出しout前に変数をインスタンス化する責任があるため、機能します。これは、呼び出されたときにoutがnullの場合でも例外をスローしますが、リンクされたソリューションと比較すると、これはこれを行う最も簡単な方法です

私はこれが一種の特定のアプリケーションであることを知っていますが、これはJavaで変数の型を見つけるためのgoogleでの最初の結果であるため(そしてそれTが一種の変数であることを考えると)、含める必要があると思います



0

基本的に、例えば:

public class Kerem
{
    public static void main(String[] args)
    {
        short x = 10;
        short y = 3;
        Object o = y;
        System.out.println(o.getClass()); // java.lang.Short
    }

}

1
小さなヒント:10歳であり、質問>一部が持っているの10人の回答> 100 upvotesがある場合、それは(不可能ではない)非常に非常に新しい答えは何か有用なものを追加できるとは考えにくい(特に、 「ここ、ほら、これは何かを出力する」というコードスニペットだけの場合...)
Marco13

-4

パブリッククラスDemo1 {

Object printType(Object o)
{
    return o;
}
 public static void main(String[] args) {

    Demo1 d=new Demo1();
    Object o1=d.printType('C');
    System.out.println(o1.getClass().getSimpleName());

}

}

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