2

我的 Java 程序中发生了这样的事情:

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

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

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

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

4

4 回答 4

3

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

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;
    }
}
于 2010-02-22T00:10:12.673 回答
2

f()您可以在包含调用的类中创建一个新的内部类g()

static abstract class MyCastingClass extends MySuperClass implements MyInterface {}

然后你可以投:

 g((MyCastingClass)o);

编辑:

但这似乎不起作用。

它允许你的代码编译,并且没有警告,但在运行时,你会得到一个ClassCastException,除非你的对象实际上是MyCastingClass

于 2010-02-21T23:46:47.800 回答
1

您可以使用反射来调用 g,类似于以下内容,但在选择正确的方法和处理异常时需要进行更多检查:

Object dest_obj_containing_g = this; // Replace with your object.
Method[] methods = dest_obj_containing_g.getClass().getDeclaredMethods();
for (Method m : methods) {
  if (m.getName().equals("g")) {
    m.invoke(dest_obj_containing_g,o);
    break;
  }
}
于 2010-02-22T00:34:31.223 回答
-1

会不会是这样的

<T extends MySuperClass implements MyInterface>

我只是在这里猜测...

于 2010-02-21T23:43:08.753 回答