【问题标题】:Cannot find symbol error, java seems to believe that the object/method does not exist找不到符号错误,java似乎认为对象/方法不存在
【发布时间】:2013-01-31 05:51:16
【问题描述】:
class Person{
private String navn;    //a Person class, "navn" means "name" in norwegian

Person(String s){
    navn = s;
    }

public String hentNavn(){ //returns the name of the person
    return navn;
    }
}

class PersonBeholder<Person>{   //a container using an own implementation of
    private Lelem forste;      //a linked list
    private int ant = 0;   //number of persons currently in the list

    private class Lelem{
        Lelem neste;
        Person personen;

        Lelem(Person p){
            personen = p;

            }

         public Person hentPerson(){ //returns the Person object
            return personen; //being pointed to
            }
        }

    public void settInnPerson(Person denne){  //this is the method for
        Lelem lel = new Lelem(denne);     //appending a Person to the list
        lel.neste = forste;
        forste = lel;
        **System.out.println(forste.hentPerson().hentNavn());**
                    /*this is where it goes wrong*/
        ant++;

    }
}
class TestPersoner2{
    public static void main (String [ ] args){
    PersonBeholder<Person> pl = new PersonBeholder<Person>();
    Person Emil = new Person("Emil");
    Person Nils = new Person("Nils");
    pl.settInnPerson(Emil);
    pl.settInnPerson(Nils);
    }
}

输出

TestPersoner2.java:35: error: cannot find symbol
                       System.out.println(forste.hentPerson().hentNavn());
                                                             ^
 symbol:   method hentNavn()
 location: class Object
 1 error

试图让 java 打印存储在容器中的人的姓名,该容器具有自己的链表数据结构实现。

我创建了一个自己的列表元素类,用于为每个元素创建指向列表中下一个元素的对象。 Lelem(列表元素)类包含一个返回 Person 对象的方法,而 Person 类包含一个返回字符串“navn”的方法,该字符串是人名。

Java 似乎认为这个 hetNavn() 方法不存在,我不明白为什么。 谁能告诉我这只是一个愚蠢的错字?

B

【问题讨论】:

  • Lelem#hentPerson() 的声明返回类型是什么?我敢打赌是Object

标签: java object methods symbols


【解决方案1】:

您的通用参数Person 隐藏了类名Person。更改通用参数名称。附带说明一下,这些是 IDE 将帮助快速查找和修复的错误类型。

【讨论】:

  • Person 声明的参数在哪里?我看不到它
  • 天哪.. 非常感谢!
  • @JanDvorak - 在 PersonBeholder 类 (PersonBeholder&lt;Person&gt;) 上。
【解决方案2】:

问题是您将PersonBeholder 设为泛型类,类型参数Person。我怀疑您打算使用Person 作为类型argument 来执行实现通用接口之类的操作。

所以在PersonBeholder 中,名称Person 并不是指您的Person 类——它指的是编译器不知道的类型参数。

只要改变这个:

class PersonBeholder<Person>{

class PersonBeholder {

并从此更改您的实例化:

PersonBeholder<Person> pl = new PersonBeholder<Person>();

到:

PersonBeholder pl = new PersonBeholder();

一切都会好起来的。

如果您真的希望您的PersonBeholder 类是通用的,请给它一个不同的类型参数名称。我怀疑你没有。

【讨论】:

  • 你说得对,它不需要是通用的,我的论文是这样说的:)谢谢!
【解决方案3】:

报错行Person表示泛型类PersonBeholder&lt;Person&gt;的类型参数,即未知类型,不是上面定义的特定类Person。您可以通过重命名泛型参数或重命名类 Person 来解决此问题。

【讨论】:

    【解决方案4】:

    您对generics 的使用不正确。

    无论如何,只需从PersonBeholder 中删除类型参数Person

    class PersonBeholder {   //a container using an own implementation of
        private Lelem forste;      //a linked list
        private int ant = 0;
    
        private class Lelem{
            Lelem neste;
            Person personen;
    
            Lelem(Person p){
                personen = p;
    
            }
    
            public Person hentPerson(){
                return personen;
            }
        }
    
        public void settInnPerson(Person denne){
            Lelem lel = new Lelem(denne);
            lel.neste = forste;
            forste = lel;
            System.out.println(forste.hentPerson().hentNavn());
            ant++;
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      相关资源
      最近更新 更多