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()方法不存在,我看不出原因。 有人可以告诉我这只是一个愚蠢的错字吗?
乙
答案 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++;
}
}