下式给出:
static class ClassA {
static <V> ClassA create( List<V> things ) {
//do something with things
return new ClassA();
}
}
static class ClassB extends ClassA {
//note: using <V> is fine, but <V extends Number> gives an error
static <V extends Number> ClassB create(List<V> numbers) {
//do something with numbers
return new ClassB();
}
}
我收到错误:
&#39;创建(列表)&#39;在&#39; ClassB&#39;与&#39;创建(列表)&#39;发生冲突在&#39; ClassA&#39 ;;两种方法都有相同的擦除,但都没有隐藏其他方法
解决这个问题的简单方法是不同地命名方法,但我想更好地理解为什么这是一个问题(如果有解决方法)。
根据我对静态方法的理解,根据对象的静态类型选择要调用的方法。因此ClassA foo = new ClassB(); foo.create(null);
会调用ClassA.create(null)
。当然,直接使用类名时选择正确的方法不应该是一个问题:ClassB.create
或ClassA.create
。
我的猜测是ClassB.create(new ArrayList<String>())
会出现问题。虽然在编译时,仍然可以确定ClassA.create
可以(应该(?))被调用。