我上了这样的课:

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,并且GenericClassGenericClass<anything>的超类型,因此Class<GenericClass>可分配给Class<? super GenericClass<T>>。您会发现此解决方案还有许多其他限制。这完全取决于您的目标。

10-07 15:33