Object o
とString className = "org.foo.Foo"
が与えられた場合、o
がList<className>
のインスタンスであるかどうかを確認したい
私はこれを試しましたが、コンパイルしません:
Class<?> cls = Class.forName(className);
if (o instanceof List<cls>){ // this gives error: cls cannot be resolved to a type
doSomething();
}
私の入力はObject o
とString className
であることに注意してください(心のタイプを入力してください)。
OK、メソッドを見つけました...それは少し汚いコードですが、動作します:
if (o instanceof List<?>){
ParameterizedType pt = (ParameterizedType)o.getClass().getGenericSuperclass();
String innerClass = pt.getActualTypeArguments()[0].toString().replace("class ", "");
System.out.println(innerClass.equals(className)); // true
}
Type Erasure が原因です。声明
if (o instanceof List<cls>) {
doSomething();
}
リストのジェネリック型が消去される実行時に実行されます。したがって、instanceof
ジェネリック型をチェックする意味はありません。
私はあなたが2つのステップでそれを行うことができると思います:最初に、あなたはそれがリストであることを確認します。
if (o instanceof List)
次に、リストの1人(それぞれ?)のメンバーが指定されたタイプを持っていることを確認します。
for (Object obj : (List) o) {
if (obj instanceof cls) {
doSomething();
}
}
私は私のプロジェクトで使用したソリューション。
/**
* Used to get List of String From Object.
*
* 1. used to convert object to list of String.
*
* @param objectList Object List.
* @return List Of String.
*/
private List<String> getListOfStringFromObject(final Object objectList) {
List<String> stringList = new ArrayList<>();
if (objectList instanceof List<?>) {
for (Object object : (List<?>) objectList) {
if (object instanceof String) {
stringList.add((String) object);
}
}
}
return stringList;
}
_public class Main{
public static void main(String[] args){
String str = "";
int oi = 0;
char c = 'a';
Main af = new Main();
checkType(str);
checkType(oi);
checkType(c);
checkType(af);
}
public static void checkType(Object o){
String str = o.getClass().getName();
switch(str){
case "Java.lang.String":
System.out.println("String");
break;
case "Java.lang.Integer":
System.out.println("Integer");
break;
case "Java.lang.Character":
System.out.println("Char");
break;
case "Main":
System.out.println("Main");
break;
default :
System.out.println("Something else:" + str);
break;
}
}
}
_
注>単にpublic static boolean checkType(Object o)
に変更してから、デフォルトではない各case
で_return true
_に変更します。
あなたがしたいことが次のような場合:
class XXX implements InterfaceX {
@Override
public void methedX() { }
}
interface InterfaceX {
void methedX();
}
List<XXX> x = new ArrayList<>();
if(x instanceOf List<InterfaceX>) {
data.get(0).methedX();
}
次のようなテンプレートを使用してみてください。
class TypeHelper <T extends InterfaceX> {
List<T> data;
TypeHelper (List<T> data) {
this.data = data;
}
public void func() {
data.get(0).methedX();
}
}
TypeHelper helper = new TypeHelper<XXX>(x);
helper.func();