为什么要将Class 的类转换为不安全?

我正在创建一个MethodPointer类,以模拟来自C ++的函数指针的function。 起初,我只使用Object s做了所有事情,但后来我有了一个想法 – 为什么不让它真正通用?

这个问题出现在这个构造函数中,它尝试使用签名MethodPointer(Class clazz, String methodName, Class ... paramClasses)调用另一个构造函数:

 public MethodPointer(T object, String methodName, Class ... paramClasses) { this(object.getClass(), methodName, paramClasses); this.object = object; } 

我认为这可以正常工作,但我收到以下编译器错误:

 The constructor MethodPointer(Class, String, Class[]) is undefined 

所以,困惑,我这样做了:

 public MethodPointer(T object, String methodName, Class ... paramClasses) { this((Class) object.getClass(), methodName, paramClasses); this.object = object; } 

它现在编译,但我收到以下警告:

 Unchecked cast from Class to Class 

我想问题是我不明白什么Class Class表示。 我认为,因为从T object参数推断出T的类型,所以调用object.getClass()将返回Class类型的Class对象是必要的 。 但显然情况并非如此。 有人可以解决我的困惑吗?


完整的类声明和所有构造函数:

 public class MethodPointer { //Logger instance private static final Logger LOGGER = Logger.getLogger(MethodPointer.class); //Object fields private final Method method; private ArrayList args = new ArrayList(); private T object = null; //Constructors public MethodPointer(Method method) { this.method = method; } public MethodPointer(Class clazz, String methodName, Class ... paramClasses) { Method theMethod = null; try { theMethod = clazz.getMethod(methodName, paramClasses); } catch(NoSuchMethodException nsme) { LogUtil.log(LOGGER, Level.ERROR, "Unable to find method " + methodName + " in " + clazz.getSimpleName(), nsme); } method = theMethod; } public MethodPointer(T object, String methodName, Class ... paramClasses) { this((Class) object.getClass(), methodName, paramClasses); this.object = object; } 

SLaks的回答指出object.getClass()衰变为Class Class ,解释编译错误。 但是转换为Class 不安全的

getClass “返回它所调用的对象的运行时类”。 例如,如果我们在一个MethodPointer ,那么object 是一个 Number但它的运行时类型可能是IntegerDouble等。这告诉我们将object.getClass()Class不是安全,因为ClassClass是不同的对象,表示不同的类 – 这种区别似乎与您尝试执行的操作的正确性非常相关。

那么解决方案是什么? 好吧,不要施展。 坚持从呼叫者那里取一个Class

问题是getClass()忽略了类型参数。

Javadocs说:

实际的结果类型是Class Class where |X| 是擦除调用getClass的表达式的静态类型。

例如, new ArrayList().getClass()返回一个Class Class ,而不是Class> Class>

这也意味着调用类型参数的getClass()衰减为Class Class

如果您不需要指定的Class类型,则可以使用

 Class 

为你参数。

所以你的课程有一个未绑定的类型。

如果你想获得一个实例,你可以像这样使用它:

 obj.getClass().getDeclaredConstructor(Class parameterTypes)