Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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());
        }
}