2011-06-30 205 views
2

具有声明这个方法的类:获取泛型类的类的类型?

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()); } 
} 

但代码不'compile.I想知道是否有可能实现我的目标?

预先感谢您的Java大师;)

回答

3
T obj = ...; 
obj.getClass() 

最后一行返回Class<? extends T> - 但T是无界的,所以它基本上是由Object界,这意味着它返回Class<? extends Object>,这与Class<?>相同。与Class<?>类型的参数,它返回一个Object

T test() { return a.test(obj.getClass()); } 

将实际调用a.test,而不是T

所以这样做。

只需将参数转换为Class<T>或返回类型为T,它应该可行 - 尽管我还不明白为什么需要这样的东西。此外,还有在原岗位这个奇怪的错误:

String s = "test"; 
a.test(s.class); 

"test".class是错误的 - 它应该是String.class

1

尝试

@SuppressWarnings("unchecked") 
T test() { 
    return (T) a.test(obj.getClass()); 
} 
2
Class<T> clazz = (Class<T>) obj.getClass(); 
return a.test(clazz); 
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,这个解决方案对你来说可能不是那么有趣......