変数がint、array、doubleなどであることを確認するにはどうすればよいですか?
編集:たとえば、変数が配列であることをどのように確認できますか?これを行う機能はありますか?
変数がint、array、doubleなどであることを確認するにはどうすればよいですか?
編集:たとえば、変数が配列であることをどのように確認できますか?これを行う機能はありますか?
回答:
Javaは静的に型付けされた言語であるため、コンパイラーはこのチェックのほとんどを行います。変数を特定のタイプであると宣言すると、コンパイラーは、そのタイプの値(またはそのタイプのサブタイプである値)のみが割り当てられるようにします。
あなたが与えた例(int、配列、double)これらはすべてプリミティブであり、それらのサブタイプはありません。したがって、変数をとして宣言すると、int次のようになります。
int x;
あなたはそれだけがint値を保持することを確認できます。
Listただし、変数をとして宣言した場合、変数がのサブタイプを保持する可能性がありますList。これらの例としてはArrayList、LinkedListなど
あなたが持っていた場合はList、変数を、そしてあなたはそれがあったかどうかを知るために必要なArrayList、次の操作を行うことができます:
List y;
...
if (y instanceof ArrayList) {
...its and ArrayList...
}
ただし、そうする必要があると思った場合は、アプローチを再考する必要があります。ほとんどの場合、オブジェクト指向の原則に従う場合、これを行う必要はありません。もちろん、すべてのルールには例外があります。
実際、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 );
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/
intの代わりにInteger、doubleの代わりにDoubleなどを使用できます(このようなクラスはすべてのプリミティブ型に存在します)。次に、演算子instanceofを使用できます。if(var instanceof Integer){...}
ただ使用する:
.getClass().getSimpleName();
例:
StringBuilder randSB = new StringBuilder("just a String");
System.out.println(randSB.getClass().getSimpleName());
出力:
StringBuilder
randSBNULLを保持している場合、これは機能しないことに注意してください。
そうですね、変数の型のチェックはこの方法で実行できると思います。
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はい、これはプリミティブもチェックしないことを知っています。
あなたの質問の最初の部分は無意味です。コンパイル時にプリミティブ変数のタイプがわからないという状況はありません。
2番目の部分については、変数が配列かどうかまだわからない唯一の状況は、それがオブジェクトである場合です。その場合object.getClass().isArray()は教えてくれます。
私はそれを使ってそれをしました: if(x.getClass() == MyClass.class){...}
私はこれらの答えのどれにも満足していませんでした、そして正しい答えは説明も否定票もないので、私は周りを検索し、何かを見つけて、理解しやすいように編集しました。期待するほど簡単ではありません。
//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());
}
変数が初期化されていないジェネリック型の場合、これらの回答はどれも機能しません
そして私が見つけたものから、それは非常に醜い回避策を使用するか、初期化されたパラメーターを関数に渡してインプレースにすることによってのみ可能です、ここを参照してください:
<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が一種の変数であることを考えると)、含める必要があると思います
Java.lang.Class.getSimpleName()変数に非プリミティブ型がある場合のみ、メソッドのみを使用して簡単に確認できます。プリミティブ型int、longなどでは機能しません。
リファレンス-Oracleのドキュメントリンクはこちら
基本的に、例えば:
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
}
}