Étant donné un Object o
et un String className = "org.foo.Foo"
, je veux vérifier si o
est une instance de List<className>
J'ai essayé mais je ne compilerai pas:
Class<?> cls = Class.forName(className);
if (o instanceof List<cls>){ // this gives error: cls cannot be resolved to a type
doSomething();
}
Veuillez noter que mes entrées sont Object o
et String className
(veuillez faire attention aux types).
Ok, j'ai trouvé une méthode ... c'est un code un peu sale mais ça marche:
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
}
Je pense que vous pouvez le faire en deux étapes: D'abord, vous vérifiez que c'est une liste.
if (o instanceof List)
Ensuite, vous vérifiez que l'un (chaque?) Membre de la liste a le type donné.
for (Object obj : (List) o) {
if (obj instanceof cls) {
doSomething();
}
}
C'est à cause de Type Erasure . La déclaration
if (o instanceof List<cls>) {
doSomething();
}
sera exécuté à l'exécution, lorsque le type générique de la liste sera effacé. Par conséquent, il est inutile de vérifier instanceof
générique-type.
Solution que j'ai utilisée dans mon projet.
/**
* 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;
}
}
}
Note> changez simplement pour public static boolean checkType(Object o)
puis return true
dans chaque case
qui n'est pas par défaut.
si ce que vous voulez faire est comme ça:
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();
}
vous pouvez essayer d'utiliser un modèle comme:
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();