Sto creando una classe MethodPointer
per simulare la funzionalità dei puntatori di funzione da C++. All'inizio, stavo facendo tutto con solo Object
s, ma poi ho pensato: perché non renderlo veramente generico?Perché la classe di un generico in Classe non è sicura?
Il problema è venuto in questo costruttore, che ha tentato di chiamare un altro costruttore con la firma MethodPointer(Class<T> clazz, String methodName, Class<?> ... paramClasses)
:
public MethodPointer(T object, String methodName, Class<?> ... paramClasses) {
this(object.getClass(), methodName, paramClasses);
this.object = object;
}
ho assunto questo avrebbe funzionato bene, ma ho ricevuto il seguente errore del compilatore:
The constructor MethodPointer<T>(Class<capture#1-of ? extends Object>,
String, Class<?>[]) is undefined
Così, confuso, ho fatto questo:
public MethodPointer(T object, String methodName, Class<?> ... paramClasses) {
this((Class<T>) object.getClass(), methodName, paramClasses);
this.object = object;
}
Ora compila, ma ricevo il seguente avviso:
Unchecked cast from Class<capture#1-of ? extends Object> to Class<T>
Credo che il problema è che non capisco cosa Class<capture#1-of ? extends Object>
mezzi. Ho pensato che dal momento che il tipo di T object
deduce dal parametro T object
che sarebbe necessario che chiamando object.getClass()
restituisce un oggetto Class
di tipo Class<T>
. Apparentemente questo non è il caso, però. Qualcuno può chiarire la mia confusione?
dichiarazione di classe completa e tutti i costruttori:
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;
}
Btw, se siete aperti a utilizzare [Guava] (https://code.google.com/p/ guava-libraries /), controlla la loro classe ['Invokable'] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/reflect/Invokable.html). –