Java 不明确的方法调用println字符数组和字符串(而不是对象) 公共类任务03{ 公共图书馆{ 试一试{ 返回(T)新整数(42); }catch(ClassCastException e){ 返回(T)新整数(43); } } 公共静态void main(字符串[]args){ Task03 v=新Task03(); System.out.println(v.foo()); } }
我在第Java 不明确的方法调用println字符数组和字符串(而不是对象) 公共类任务03{ 公共图书馆{ 试一试{ 返回(T)新整数(42); }catch(ClassCastException e){ 返回(T)新整数(43); } } 公共静态void main(字符串[]args){ Task03 v=新Task03(); System.out.println(v.foo()); } },java,generics,overloading,wildcard,Java,Generics,Overloading,Wildcard,我在第System.out.println(v.foo())行有一个编译错误 方法调用不明确:println(char[])和println(String)都匹配 我不清楚为什么java试图使用这两种方法而不是println(Object)或println(int) 我们如何理解这种java编译器行为 谢谢Java选择了最特别适用的方法。因为是在调用站点确定的,所以可以选择采用引用类型参数的任何PrintStream.println方法 发件人: 非正式的直觉是,如果第一个方法处理的任何调用都可
System.out.println(v.foo())行有一个编译错误代码>
方法调用不明确:println(char[])和println(String)都匹配
我不清楚为什么java试图使用这两种方法而不是println(Object)
或println(int)
我们如何理解这种java编译器行为
谢谢Java选择了最特别适用的方法。因为
是在调用站点确定的,所以可以选择采用引用类型参数的任何PrintStream.println
方法
发件人:
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而不会出现编译时错误,那么一个方法比另一个方法更为具体
可以传递给println(char[])
或println(String)
的任何内容也可以传递给println(Object)
,因此前一种方法比后一种方法更具体。因此,这些将优先选择println(对象)
但是,一些可以传递给println(char[])
的内容无法传递给println(String)
,因此这两个内容都不比另一个更具体,因此方法调用不明确。println(Integer)
不存在<代码> PROTLN(String)和 PROTLN(CHAR[]) 比 PROTLN(Object) 更具体。即使<代码> PROTLN(整数)确实存在,编译器也不会比“代码>字符串和<代码> CHAR[]/COD>重载更具体地考虑它。方法签名中没有任何表示将返回整数的内容。我可以传递给println(int)或println(double)的所有内容也可以传递给println(Object)。为什么char[]或String方法比int或double方法更具体?潜在的方法在3个过程中匹配,在每个过程中变得不那么严格,并且只有在当前过程中找不到方法时才继续下一个过程char[]
,String
和Object
在第一次传递时匹配int
和double
将在第二次传递时匹配,这允许使用取消装箱进行匹配(除非匹配永远不会走到这一步)。
public class Task03<K> {
public <T> T foo() {
try {
return (T) new Integer(42);
} catch (ClassCastException e) {
return (T) new Integer(43);
}
}
public static void main(String[] args) {
Task03<?> v = new Task03<>();
System.out.println(v.foo());
}
}