具有声明为此的方法的类:
public class A{
public <T> T test(java.lang.Class<T> classOfT)
}
通常可以针对这样的对象调用它:
A a = new A()
String s = "test";
a.test(String.class); //I wrote this as s.class at first,which is wrong.Thanks Nick.
现在我想概括传递给它的对象,所以我声明了一个这样的类:
public class B <T>{
private A a = new A();
private T obj = null;
T test(){return a.test(obj.getClass()); }
}
但代码不会'编译。我想知道是否有可能实现我的目标?
提前感谢Java大师;)
答案 0 :(得分:3)
T obj = ...;
obj.getClass()
最后一行返回Class<? extends T>
- 但T
无界限,因此它基本上以Object
为界,这意味着它返回Class<? extends Object>
,这与Class<?>
。
这样做:
T test () { return a.test(obj.getClass()); }
实际上会使用a.test
类型的参数调用Class<?>
,该参数返回Object
,而不是T
。
只需将参数转换为Class<T>
或将返回类型转换为T
,它应该有效 - 尽管我还不明白为什么你需要这样的东西。此外,原帖中还有这个奇怪的错误:
String s = "test";
a.test(s.class);
执行"test".class
是错误的 - 它应该是String.class
。
答案 1 :(得分:2)
Class<T> clazz = (Class<T>) obj.getClass();
return a.test(clazz);
答案 2 :(得分:1)
尝试
@SuppressWarnings("unchecked")
T test() {
return (T) a.test(obj.getClass());
}
答案 3 :(得分:0)
作为其他答案的补充,将您的功能定义为
public class A{
public <T> T test(java.lang.Class<T> classOfT) { ... }
}
如果您使用classOfT
参数来确定T
的类型,那么最好不要使用任何参数来定义方法。例如,这样做而不是上面的声明:
public class A{
public <T> T test() { ... }
}
这样你就可以使用这种合格的方法调用语法来调用它。这就是我重写代码的方式:
public class A{
public <T> T test() {
// ...
}
public static void main(String[] args) {
A a = new A();
String result = a.<String>test();
}
}
public class B <T> {
private A a = new A();
T test() {
return this.a.<T>test();
}
}
这样,您就不需要向泛型A#test()
函数传递一个类参数,该参数可能在运行时未被使用。
当然如果你在运行时使用classOfT
,这个解决方案对你来说可能没那么有趣......