1 回答
TA贡献1856条经验 获得超5个赞
由于类型擦除,您想要使用代码的方式实际上是不可能的。
然而,一些通用信息在运行时被保留,即当它可以被反射访问时。一种这样的情况是类层次结构上的泛型,即你可以做这样的事情(我们经常这样做):
//Note that I used T instead of Data to reduce confusion
//Data looks a lot like an actual class name
public abstract class DataContainer<T>{
public DataContainer(String method) throws NoSuchMethodException, SecurityException {
Class<?> actualClass = getActualTypeForT();
//use reflection to get the method from actualClass and call it
}
protected Class<?> getActualTypeForT() {
//get the generic boundary here, for details check http://www.artima.com/weblogs/viewpost.jsp?thread=208860
}
}
//A concrete subclass to provide the actual type of T for reflection, can be mostly empty
public class SomeClassContainer extends DataContainer<SomeClass> {
//constructor etc.
}
类字段或参数应该有类似的东西,尽管我没有测试过。由于类型擦除,您想要使用代码的方式实际上是不可能的。
然而,一些通用信息在运行时被保留,即当它可以被反射访问时。一种这样的情况是类层次结构上的泛型,即你可以做这样的事情(我们经常这样做):
//Note that I used T instead of Data to reduce confusion
//Data looks a lot like an actual class name
public abstract class DataContainer<T>{
public DataContainer(String method) throws NoSuchMethodException, SecurityException {
Class<?> actualClass = getActualTypeForT();
//use reflection to get the method from actualClass and call it
}
protected Class<?> getActualTypeForT() {
//get the generic boundary here, for details check http://www.artima.com/weblogs/viewpost.jsp?thread=208860
}
}
//A concrete subclass to provide the actual type of T for reflection, can be mostly empty
public class SomeClassContainer extends DataContainer<SomeClass> {
//constructor etc.
}
类字段或参数应该有类似的东西,尽管我没有测试过。
添加回答
举报