我把方法改成了generic方法。现在发生的事情是,我在methodB
内部对类进行了封装,并访问了它的方法,我再也不能这样做了。
<T> void methodB(Class<T> clazz) {
T var;
HashMap<String, T> hash = new HashMap<>();
}
void methodA () {
methodB(classA.class);
}
最初在methodB
内部没有泛型,
var = mapper.convertValue(iter.next(), ClassA.class);
var.blah() //works fine
在使用泛型之后,
var = mapper.convertValue(iter.next(), clazz);
var.blah() //cannot resolve the method.
如何访问classA
的blah()
方法?
3条答案
按热度按时间xcitsw881#
在运行时为
var
赋值的那一行是绝对无关紧要的。对于编译调用来说,唯一重要的是var
的静态(编译时)类型。由于T
是无界的(除了Object
),因此除了Object
提供的方法之外,还不知道它是否支持任何方法。这两段代码都应该无法编译。i86rm4rw2#
我认为你应该使用接口而不是泛型,如果你想在各种类(A,X,Y,Z)上调用相同的'blah'函数(每个类都有相同的函数签名)。
你的另一个选择(如果你不能修改A,e. t. c)是使用反射。在https://docs.oracle.com/javase/tutorial/reflect/中阅读更多信息
ulmd4ohb3#
感谢Passing a class with type parameter as type parameter for generic method in Java。使用TypeToken解决