Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java.lang.reflect.Type检查实例_Java_Generics_Reflection - Fatal编程技术网

使用java.lang.reflect.Type检查实例

使用java.lang.reflect.Type检查实例,java,generics,reflection,Java,Generics,Reflection,我正在寻找一种方法来确定对象x是否是一个实例 属于泛型的。例如列表 受超级类型标记习惯用法的启发,我可以在运行时使用以下代码检索java.lang.reflect.Type import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; public class Test { public static void main(String[] args)

我正在寻找一种方法来确定对象
x
是否是一个实例 属于泛型的。例如
列表

受超级类型标记习惯用法的启发,我可以在运行时使用以下代码检索
java.lang.reflect.Type

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        TypeReference<List<String>> ref = new TypeReference<List<String>>() {};
        System.out.println(ref.getType());
        System.out.println(ref.getType().getClass());
    }

    abstract static class TypeReference<T> {
        private final Type type;

        protected TypeReference() {
            ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();
            type = superclass.getActualTypeArguments()[0];
        }

        public Type getType() {
            return type;
        }
    }
}
import java.lang.reflect.ParameterizedType;
导入java.lang.reflect.Type;
导入java.util.List;
公开课考试{
公共静态void main(字符串[]args){
TypeReference ref=新的TypeReference(){};
System.out.println(ref.getType());
System.out.println(参考getType().getClass());
}
抽象静态类类型引用{
私有最终类型;
受保护的类型引用(){
ParameteredType超类=(ParameteredType)getClass().getGenericSuperclass();
类型=超类。getActualTypeArguments()[0];
}
公共类型getType(){
返回类型;
}
}
}
输出是

java.util.List<java.lang.String>
class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
java.util.List
类sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
如何将此信息用于动态强制转换或类型检查


背景是我目前正在编写一个异构类型安全容器库,并希望添加对泛型类型的支持

您必须注意,您正在使用参数化类型作为
TypeReference
实例的类型参数。因此,您需要在调用者端将其强制转换为
ParameterizedType
,并从中获取原始类型

然后您可以将该rawtype强制转换为
Class
type,并使用
Class#isInstance()
方法:

public static void main(String[] args) {
    TypeReference<List<String>> ref = new TypeReference<List<String>>() {};

    List<String> list = new ArrayList<String>();

    Type rawType = ((ParameterizedType)ref.getType()).getRawType();
    boolean listIsInstanceOfRawType = ((Class<?>)(rawType)).isInstance(list));

    System.out.println(listIsInstanceOfRawType); // true
}

这误导了OP,使其认为这实际上会检查泛型部分。不会的。@mike好吧,这是你能得到的最好的了。真遗憾。我正在编写一个异构类型安全容器,并希望添加对泛型的支持。当然,您已经构造了一个表示泛型类型的对象,但实际上无法使用它来确定另一个对象的泛型类型。
List<String> list = new ArrayList<String>();

System.out.println(list instanceof List<String>);  // Won't compile
System.out.println(list instanceof List);          // You've to do this.

// The reason is, this is true
System.out.println(new ArrayList<String>().getClass() == new ArrayList<Integer>().getClass());   // true