考虑以下代码:
public class Generics {
C c; // initialized at runtime
public void testGenericsCall(Object o) {
c.myMethod(o);
}
}
class C<E> {
public void myMethod(E input) {
}
}
这是有效的,但我收到警告,因为参数化类 C 与原始类型一起使用。我不能使用像这样的声明
C<String> c;
因为只有在运行时才知道 C 的类型。我也无法向泛型类添加类型参数,因为我需要在知道 C 的类型之前创建此类的对象。声明
C<?> c;
或者
C<? extends Object> c;
对于编译器来说可以,但是方法 testGenericsCall 无法编译(“实际参数 java.lang.Object 无法通过方法调用转换转换为捕获#1?”)
处理这种情况的最佳方法是什么?
编辑:请注意,当我实际(在运行时)创建 C 的实例时,我知道它的类型参数,这部分代码是类型安全的并且运行良好。在实际代码中,我没有单个“C”类,而是一系列相互关联的类,并且泛型肯定是有用的(即使在这个简化的示例中这并不明显 - 所以请不要只告诉我不要使用泛型:)。我已经有了编译时类型安全,但不是在这里,而是在 C 和其他类之间(这里没有显示)。
我看到在这种情况下我无法在编译时检查类型参数,这就是我尝试声明它的原因 C<?> c
。在这里,我只是在寻找在没有编译器警告的情况下桥接通用代码和非通用代码的最佳方法。