Почему приведение класса универсального к классу <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;
    }

Ответы на вопрос(3)

Ваш ответ на вопрос