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函数时,它究竟在什么时候强制转换对象 .
此外,我怎么能叫foo的A<?>?这是我实际需要做的事情.或者除了以外的任何其他参数是不可能的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作为参数传递,否则通常不能调用这些方法,这可以指定给任何引用类型.