Java:通用接口和函数

Alb*_*ert 2 java generics interface

我还在试验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());
}
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误(对于foo-call):

The method foo(capture#1-of ?) in the type Main.A<capture#1-of ?> is not applicable for the arguments (Object)
Run Code Online (Sandbox Code Playgroud)

我不知道这是为什么.Eclipse告诉我,foo演员之后的签名A<?>foo(? obj)我认为的相同foo(Object obj).

assert成功.

我试图弄清楚的是,当我调用foo函数时,它究竟在什么时候强制转换对象 .

此外,我怎么能叫fooA<?>?这是我实际需要做的事情.或者除了以外的任何其他参数是不可能的null

一个更真实的例子,我真的很想知道这个:我经常使用Comparable<T>界面.那个案子实际上更复杂; 如果这里没有回答,我可能会打开另一个问题.

Mar*_*ers 10

我不知道这是为什么.Eclipse告诉我,在转换为A之后foo的签名是foo(?obj),我认为它与foo(Object obj)相同.

不,绝对不是.想象一下,A<T>List<T>foo(T)正在add(T)A<?>List<?>.你应该这样做吗?

 List<String> strList = new ArrayList<String>();
 List<?> wcList = strList;
 wcList.add(Integer.valueOf(6));  //possible if add(?) is same as add(Object)

 //...
 String str = strList.get(0);
Run Code Online (Sandbox Code Playgroud)

当然不是,因为你在最后一行得到了ClassCastException.

什么foo(?)真正的意思是,该方法适用于一些未知的,但具体的类型.除非将null作为参数传递,否则通常不能调用这些方法,这可以指定给任何引用类型.