我上了这样的课:
public class GenericClass<T> {
public void wrap(T item) {...}
}
public abstract class AbstractClass<T, G extends GenericClass<T>> {
protected G wrapper;
public AbstractClass(Class<G> generic, T something) {
wrapper = generic.newInstance();
wrapper.wrap(something);
}
public G wrapAndGet(T item) throws Exception {
wrapper.wrap(item);
return wrapper;
}
}
// 90% of the time people only need this:
public class GeneralClass<T> extends AbstractClass<T, GenericClass<T>> {
public GeneralClass(T something) {
super(GenericClass.class, something); // !error, asking for Class<GenericClass<T>>
}
}
// and use it like this:
new GeneralClass<String>("foo").wrapAndGet("bar");
// but sometimes you might need:
public class AdvancedWrapper<T> extends GenericClass<T> {
public T advancedMethod();
}
public class ClassUseAdvancedWrapper<T> extends AbstractClass<T, AdvancedWrapper<T>> {
public ClassUseAdvancedWrapper(T something) {
super(AdvancedWrapper.class, something); // error, but let's say it compiles
}
}
// then you can use:
new ClassUseAdvancedWrapper<String>("foo").wrapAndGet("bar").advancedMethod();
这对我来说没有意义:
GenericClass<T>
和GenericClass在运行时是否具有相同的类吗?那我怎么得到GenericClass<T>
的类对象呢?编辑:添加用例
最佳答案
类文字,例如。 Foo.class
,不包括通用类型信息。 The JLS states
C.class
的类型为C
,其中Class<C>
是类,接口或数组类型的名称(第4.3节)。
这也意味着表达式的类型包含原始类型,即。在Class<GenericClass>
中,GenericClass
未参数化,因此是原始的。
所以,这里的问题是您的抽象类的构造函数期望
Class<G> generic
G
在哪里G extends GenericClass<T>>
如此靠近)
Class<G extends GenericClass<T>>
但是你提供
Class<GenericClass>
这些是不可分配的。
你问
那我怎样才能得到GenericClass的类对象呢?
你不能它不存在。在运行时,
Class
没有GenericClass<T>
对象,Class
只有一个GenericClass
对象。您必须更详细地说明您要尝试执行的操作,但是可以使用以下命令编译代码
abstract class AbstractClass<T, G extends GenericClass<T>> {
public AbstractClass(Class<? super G> generic, T something) {
}
}
现在,您的构造函数需要一个
Class<? super G extends GenericClass<T>>
,而您正在提供一个Class<GenericClass>
。在super
构造函数中,调用GenericClass<T>
绑定到G
,并且GenericClass
是GenericClass<anything>
的超类型,因此Class<GenericClass>
可分配给Class<? super GenericClass<T>>
。您会发现此解决方案还有许多其他限制。这完全取决于您的目标。