1. ホーム
  2. java

[解決済み] オブジェクトを汎用型にキャストして返す

2022-04-26 08:03:22

質問

オブジェクトをメソッドの戻り値にキャストする方法はありますか? この方法で試したのですが、"instanceof"の部分でコンパイル時例外が発生しました。

public static <T> T convertInstanceOfObject(Object o) {
    if (o instanceof T) {
        return (T) o;
    } else {
        return null;
    }
}

こちらも試してみましたが、実行時例外であるClassCastExceptionが発生しました。

public static <T> T convertInstanceOfObject(Object o) {
    try {
        T rv = (T)o;
        return rv;
    } catch(java.lang.ClassCastException e) {
        return null;
    }
}

簡単にできる方法はないでしょうか。

String s = convertInstanceOfObject("string");
System.out.println(s); // should print "string"
Integer i = convertInstanceOfObject(4);
System.out.println(i); // should print "4"
String k = convertInstanceOfObject(345435.34);
System.out.println(k); // should print "null"

EDIT: 正解の作業コピーを書きました。

public static <T> T convertInstanceOfObject(Object o, Class<T> clazz) {
    try {
        return clazz.cast(o);
    } catch(ClassCastException e) {
        return null;
    }
}

public static void main(String args[]) {
    String s = convertInstanceOfObject("string", String.class);
    System.out.println(s);
    Integer i = convertInstanceOfObject(4, Integer.class);
    System.out.println(i);
    String k = convertInstanceOfObject(345435.34, String.class);
    System.out.println(k);
}

解決方法は?

を使用する必要があります。 Class インスタンスを作成する必要があります。

public static <T> T convertInstanceOfObject(Object o, Class<T> clazz) {
    try {
        return clazz.cast(o);
    } catch(ClassCastException e) {
        return null;
    }
}

の宣言は そのメソッド

public T cast(Object o)

これは、配列型にも使用できます。以下のような感じでしょうか。

final Class<int[]> intArrayType = int[].class;
final Object someObject = new int[]{1,2,3};
final int[] instance = convertInstanceOfObject(someObject, intArrayType);

ただし someObject に渡されます。 convertToInstanceOfObject はコンパイル時の型である Object .