我仍在试验Java如何处理泛型。我偶然发现了一个事实/问题/事情,如果你有一个通用接口,比如a<;T>
,之后您不能真正检查某个对象是否真的实现了A<;B>
或A<;C>代码>。
我想知道这是否会造成实际问题。
现在我已经尝试了这个代码:
static interface A<T> { void foo(T obj); }
static class B implements A<B> {
public void foo(B obj) { obj.bar(); }
void bar() {}
}
static {
assert (new B() instanceof A<?>);
((A<?>) new B()).foo(new Object());
}
这给了我这个错误(对于<code>foo</code>-调用):
The method foo(capture#1-of ?) in the type Main.A<capture#1-of ?> is not applicable for the arguments (Object)
我不知道为什么。Eclipse告诉我,在转换到A<;之后,
foo的签名是什么>
是foo(?obj)
,我认为这与foo(Object obj)[/code>相同。
断言
成功。
我试图弄清楚的是,当我调用<code>foo</code>函数时,它到底在什么时候抛出对象。
此外,如何从A<;调用
foo
>代码>?这就是我真正需要做的事情。或者,除了<code>null</code>之外,其他任何参数都不可能做到这一点吗?
一个更真实的例子,我真的对此感到好奇:我使用Comparable<;T>代码>接口很多。这种情况实际上更为复杂;如果这里没有回答这个问题,我可能会提出另一个问题。