Почему приведение класса универсального к классу <T> небезопасно?
я делаюMethodPointer
Класс для имитации функциональности указателей на функции из C ++. Сначала я делал все простоObject
с, но потом у меня возникла мысль - почему бы не сделать его действительно общим?
Проблема возникла в этом конструкторе, который попытался вызвать другой конструктор с подписью: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
средства. Я думал, что так как типT
выводится изT object
параметр, который будетнеобходимо это призвание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;
}