我的Java程序中发生了类似的事情:

void f(Object o) {
    g(o);
}

<T extends MySuperClass & MyInterface> void g(T x) {
    ...;
}


我怎样才能使它起作用?如果不使用泛型,似乎无法在变量声明中同时指定基类和接口。我不认为泛型在这里会起作用,因为o是使用反射动态创建的,因此在编译时不知道其实际类。

(是的,我知道这是一件很奇怪的事情。但是实际上,我确实需要超类和接口的功能。我想我可以在运行时使用instanceof进行所有类型检查,但这看起来像Java 1.4 ...)

最佳答案

似乎没有办法调用“原始”通用方法。但是您可以创建原始类型的对象(以下转换显然是不安全的):

void f(Object o) {
    Caster<?> c = new Caster();
    g(c.cast(o));
}

class Caster<T extends MySuperClass & MyInterface> {
    public T cast(Object o) {
        return (T) o;
    }
}

09-05 16:09