Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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 类型的方法不明确-为什么不解析_Java - Fatal编程技术网

Java 类型的方法不明确-为什么不解析

Java 类型的方法不明确-为什么不解析,java,Java,编译器说方法饥饿(Mamal)是不明确的。 我希望执行“Human”方法,因为它是最低级别的。我未能从继承层次结构中的人和鸟找到歧义的原因(虽然不是直观的)。或者将它们视为完全不相关的引用类型。因此,一个并不比另一个更具体 如果删除饥饿(Bird)方法,代码将编译 更具体的规则是 一个名为m的固定arity成员方法比另一个更具体 如果满足以下所有条件,则具有相同名称和arity的成员方法 条件如下: 第一个成员方法的参数的声明类型为 T1,…,Tn 另一个方法的参数声明类型为U1。。。, 联合

编译器说方法饥饿(Mamal)是不明确的。
我希望执行“Human”方法,因为它是最低级别的。我未能从继承层次结构中的人和鸟找到歧义的原因(虽然不是直观的)。或者将它们视为完全不相关的引用类型。因此,一个并不比另一个更具体

如果删除
饥饿(Bird)
方法,代码将编译

更具体的规则是

一个名为m的固定arity成员方法比另一个更具体 如果满足以下所有条件,则具有相同名称和arity的成员方法 条件如下:

  • 第一个成员方法的参数的声明类型为 T1,…,Tn

  • 另一个方法的参数声明类型为U1。。。, 联合国

  • 如果第二种方法是泛型的,那么让R1。。。Rp(p≥ 1) 是 类型参数,设Bl为Rl(1)的声明界≤ L≤ p) ,让 A1。。。Ap是为此推断的类型参数(§15.12.2.7)
    初始约束下的调用Ti由于
    null
    没有与之关联的类型,编译器不知道应该调用哪个
    方法;因此,它是“模棱两可的”。要消除歧义,只需将其转换为:

    method(null);
    

    这是因为您有三个同名的方法,并且您正在传递一个空值。编译器不知道您正在调用哪个方法。只需写一个ie
    public void hunger(动物)
    ,然后检查里面的动物类型。例如
    if(Bird的动物实例){System.out.println(“Bird”)…

    同时将方法名更改为小写。有时编译器会失败。

    “我希望执行“Human”方法”因为当null是一个
    Human
    实例时?@Sergi:通常来说,是的-但这不是语言规则的一部分,这就是这个问题的内容。@m0skit0:the
    null
    文本可以转换为任何类类型。null不是实例。它只是一个值。请不要大写方法的名称。@TedBigham Human扩展了哺乳动物,因此被认为比哺乳动物更具体。我现在看到了。谢谢!
    public void Hungry(Human human){
        System.out.println("Human");        
    }
    public void Hungry(Bird bird){
        System.out.println("Bird");
    }
    
    S1 = U1
    
    void method(String s){}
    void method(RandomReferenceType t) {}
    
    method(null);
    
    public class Main {
    
        public void hungry(Mamal mamal){
            System.out.println("Mammal");
        }   
        public void hungry(Human human){
            System.out.println("Human");        
        }
        public void hungry(Bird bird){
            System.out.println("Bird");
        }
        public static void main(String a[]){
            Main main = new Main();
            main.hungry((Mamal)null);
        }
    }
    
    class Animal {}
    class Bird extends Animal {}
    class Mamal extends Animal {}
    class Human extends Mamal {}