找不到符号错误,java似乎认为对象/方法不存在

时间:2013-02-15 09:27:37

标签: java object methods symbols

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(list element)类包含一个返回Person对象的方法,Person类包含一个返回String“navn”的方法,该方法是person的名称。

Java似乎认为这个hentNavn()方法不存在,我看不出原因。 有人可以告诉我这只是一个愚蠢的错字吗?

4 个答案:

答案 0 :(得分:2)

问题在于,您已使PersonBeholder成为通用类,其中类型参数Person。我怀疑你打算做一些类似实现通用接口的事情,使用Person作为类型参数

因此在PersonBeholder中,名称Person不引用您的Person类 - 它引用了类型参数,编译器对此一无所知。

只需改变一下:

class PersonBeholder<Person>{

class PersonBeholder {

并从中更改您的实例化:

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

为:

PersonBeholder pl = new PersonBeholder();

一切都会好的。

如果确实希望您的PersonBeholder类是通用的,请为其指定不同的类型参数名称。我怀疑你没有。

答案 1 :(得分:1)

您的通用参数Person隐藏了类名Person。更改通用参数名称。另外,这些是IDE有助于快速查找和修复的错误类型。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您对generics的使用不正确。

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

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++;

    }
}