我有一个泛型类,其方法调用另一个需要类对象作为其参数之一的方法。我希望能够使用在对象创建时设置为泛型的类类型,但我似乎不太能正确理解语法。这是我想做的事情:
public abstract class GenericClass<T> {
private void doStuff() {
//do a bunch of stuff
//This method's signature is methodToCall(Serializable s) and is not a method I can change
methodToCall(T);
methodToCall(Class<T>);
methodToCall(T.class);
//do some more stuff
}
}
public class NonGenericClass extends GenericClass<DesiredClass> {
}
Class 对象类型是可序列化的,因此可以这样工作:
methodToCall(DesiredClass.class);
但是我不能轻易地重写该方法,因为我最终只是复制了所有代码,因为方法中间需要类类型。
这是迄今为止我想出的最好的:
public abstract class GenericClass<T> {
protected abstract void doStuff();
protected <T> void doStuff(Class<T> cls) {
methodToCall(cls);
}
}
public class NonGenericClass extends GenericClass<DesiredClass> {
@Override
protected void doStuff() {
doStuff(DesiredClass.class);
}
}
这行得通,但感觉泛型类正在浪费它所拥有的关于 T 是什么的知识。methodToCall
我首先列出的 3 个调用版本中是否存在语法错误?这是不能做的事情吗?
希望这一切都有意义。