【发布时间】:2013-08-12 23:30:41
【问题描述】:
我正在创建一个MethodPointer 类,以便从 C++ 模拟函数指针的功能。起初,我只用 Objects 做所有事情,但后来我有了一个想法——为什么不让它真正通用呢?
问题出在这个构造函数上,它试图调用另一个签名为MethodPointer(Class<T> clazz, String methodName, Class<?> ... paramClasses)的构造函数:
public MethodPointer(T object, String methodName, Class<?> ... paramClasses) {
this(object.getClass(), methodName, paramClasses);
this.object = object;
}
我认为这会正常工作,但我收到以下编译器错误:
The constructor MethodPointer<T>(Class<capture#1-of ? extends Object>,
String, Class<?>[]) is undefined
所以,很困惑,我这样做了:
public MethodPointer(T object, String methodName, Class<?> ... paramClasses) {
this((Class<T>) object.getClass(), methodName, paramClasses);
this.object = object;
}
现在可以编译,但我收到以下警告:
Unchecked cast from Class<capture#1-of ? extends Object> to Class<T>
我想问题是我不明白Class<capture#1-of ? extends Object> 是什么意思。我认为由于T 的类型是从T object 参数推断出来的,因此调用object.getClass() 会返回Class 类型为Class<T> 的对象。不过,显然情况并非如此。有人能解开我的困惑吗?
完整的类声明和所有构造函数:
public class MethodPointer<T> {
//Logger instance
private static final Logger LOGGER = Logger.getLogger(MethodPointer.class);
//Object fields
private final Method method;
private ArrayList<Object> args = new ArrayList<Object>();
private T object = null;
//Constructors
public MethodPointer(Method method) {
this.method = method;
}
public MethodPointer(Class<T> 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<T>) object.getClass(), methodName, paramClasses);
this.object = object;
}
【问题讨论】:
标签: java generics casting type-inference