0
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 似乎认为这个 hentNavn() 方法不存在,我不明白为什么。有人可以告诉我这只是一个愚蠢的错字吗?

4

4 回答 4

2

问题是您创建了PersonBeholder一个泛型类,其类型参数Person. 我怀疑您打算使用作为类型参数来执行诸如实现通用接口之类的事情。Person

因此,在 中PersonBeholder,名称Person并不指代您的Person类 - 它指的是类型参数,编译器对此一无所知。

只需更改此:

class PersonBeholder<Person>{

class PersonBeholder {

并从此更改您的实例化:

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

至:

PersonBeholder pl = new PersonBeholder();

一切都会好起来的。

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

于 2013-02-15T09:32:48.480 回答
1

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

于 2013-02-15T09:31:22.557 回答
1

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

于 2013-02-15T09:32:55.303 回答
0

您对泛型的使用不正确。

无论如何,只需PersonPersonBeholder.

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

    }
}
于 2013-02-15T09:35:20.477 回答