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()メソッドが存在しないと考えているようで、その理由がわかりません。誰かがそれがただのばかげたタイプミスだと教えてもらえますか?

B

4

4 に答える 4

2

問題は、型パラメーターが。PersonBeholderのジェネリッククラスを作成したことです。型引数として使用して、ジェネリックインターフェイスを実装するようなことをするつもりだったのではないかと思います。PersonPerson

したがって、内PersonBeholderでは、名前はクラスPersonを参照してPersonいません。コンパイラが何も知らないtypeパラメータを参照しています。

これを変更するだけです:

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これは、ジェネリックパラメーターの名前を変更するか、クラスの名前を変更することで修正できますPerson

于 2013-02-15T09:32:55.303 に答える
0

ジェネリックの使用法が正しくありません。

とにかく、typeパラメータ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++;

    }
}
于 2013-02-15T09:35:20.477 に答える