Класс LinkedList не может получить доступ к другим классам

#java #linked-list

#java #связанный список

Вопрос:

У меня есть класс LinkedList, который по какой-то причине не может получить доступ к моим методам класса Student. Я не понимаю, почему это происходит из-за того, что мой класс linkedlist имеет тип Student. Я продолжаю получать сообщение об ошибке не удается найти символ symbol: метод getName() Местоположение: переменные данные типа Student, где Student является переменной типа: Student расширяет объект, объявленный в узле класса. Приведенный ниже метод взят из моего связанного класса list

 public double findGpa(String name){
    Node<Student> temp = head;
    double foundData = 0.0;
    for(int i = 1 ; (i < size); i  ){
        if(temp.data.getName().equals(name)){
            foundData = temp.data.getGpa();
        }
        temp = getNode(i);
    }

    return foundData;
}
  

getGpa — это метод в моем классе Student, потому что узел имеет тип student, а данные также имеют тип student Я не понимаю, почему он не может получить доступ к методам Student
Мой класс student указан ниже

 package lab3;


public class Student {

    private String fullName;
    private double gpa;

    public Student(String name, double gpa){
        fullName = name;
        this.gpa = gpa;
    }

    public void setGpa(double grade){
        gpa = grade;
    }

    public void setName(String name){
        fullName = name;
    }

    public double getGpa(){
        return gpa;
    }

    public String getName(){
        return fullName;
    }

}
  

Вот весь класс LinkedList, который имеет класс Node в качестве внутреннего класса

 package lab3;

/**
 *
 * @author Chris
 */
/**
 * SingleLinkedList is a class that provides some of the
 * capabilities required by the List interface using
 * a single linked list data structure.
 * Only the following methods are provided:
 * get, set, add, remove, size, toString
 * @author Koffman and Wolfgang 
 * @param <Student> 
 */
public class StudentSingleLinkedList<Student> {

    private static class Node<Student> {

        /** The data value. */
        private Node<Student> next;
        /** The link */
        private Student data;

        /**
         * Construct a node with the given data value and link
         * @param data - The data value
         * @param next - The link
         */
        public Node(Student d, Node<Student> next) {
            this.next = next;
            data = d;
        }

        /**
         * Construct a node with the given data value
         * @param data - The data value
         */
        public Node(Student d) {
            data = d;
            next = null;
        }
    }

    // Data fields
    /** A reference to the head of the list */
    private Node<Student> head = null;
    /** The size of the list */
    private int size = 0;


    // Helper Methods
    /** Insert an item as the first item of the list.
     *  @param item The item to be inserted
     */
    private void addLast(Student item){

        Node<Student> newNode = getNode(size);
        newNode.next = new Node<Student>(item, newNode.next);
        size  ;

    }

    private void addFirst(Student item) {
        head = new Node<Student>(item, head);
        size  ;
    }

    /**
     * Add a node after a given node
     * @param node The node which the new item is inserted after
     * @param item The item to insert
     */
    private void addAfter(Node<Student> node, Student item) {
        node.next = new Node<Student>(item, node.next);
        size  ;
    }

    /**
     * Remove the first node from the list
     * @returns The removed node's data or null if the list is empty
     */
    private Student removeFirst() {
        Node<Student> temp = head;
        if (head != null) {
            head = head.next;
        }
        if (temp != null) {
            size--;
            return temp.data;
        } else {
            return null;
        }
    }

    /*
    public double findGpa(String name){
        Node<Student
    }
    */


    private double findGpa(String name){
        Node<Student> temp = head;
        double foundData = 0.0;
        for(int i = 1 ; (i < size); i  ){
            if(temp.data.getName().equals(name)){
                foundData = temp.data.getGpa();
            }
            temp = getNode(i);
        }

        return foundData;
    }


    public Student updateGpa(String name){
        Node<Student> temp = head;
        if(temp.next.equals(name)){
            temp.data =
        }
    }
    /**
     * Remove the node after a given node
     * @param node The node before the one to be removed
     * @returns The data from the removed node, or null
     *          if there is no node to remove
     */
    private Student removeAfter(Node<Student> node) {
        Node<Student> temp = node.next;
        if (temp != null) {
            node.next = temp.next;
            size--;
            return temp.data;
        } else {
            return null;
        }
    }

    /**
     * Find the node at a specified index
     * @param index The index of the node sought
     * @returns The node at index or null if it does not exist
     * 
     * 
     */
    private Node<Student> getNode(int index){
        Node<Student> temp = head;
        if(temp == null){
            return null;
        }
        else{
            for(int i = 0; i < index - 1; i  ){
                temp = temp.next;
            }         
        }
        return temp;
    }

    // Public Methods
    /**
     * Get the data value at index
     * @param index The index of the element to return
     * @returns The data at index
     * @throws IndexOutOfBoundsException if the index is out of range
     * 
     * 
     * Uses getNode() to access the nodes index then calls the .data to get 
     * whatever data is being stored inside that node.
     */
    public Student get(int index) {
       Node<Student> temp = getNode(index);
       if(temp== null){
           throw new IndexOutOfBoundsException();
       }

       return temp.data;

    }

    /**
     * Set the data value at index
     * @param index The index of the item to change
     * @param newValue The new value
     * @returns The data value previously at index
     * @throws IndexOutOfBoundsException if the index is out of           
     *  range
     * 
     * 
     * Uses the getNode method to get the index of the node and replace it with
     * the data that temp holds
     */
    public Student set(int index, Student newValue) {
        if(head == null){
            return null;
        }
        if(index > size){
            throw new IndexOutOfBoundsException();
        }
        Node<Student> temp = getNode(index);
        Student temp2 = temp.data;
        temp.data = newValue;
        return temp2;

    }

    /**
     * Insert the specified item at the specified position in the list.
     * Shifts the element currently at that position (if any) and any
     * subsequent elements to the right (adds one to their indicies)
     * @param index Index at which the specified item is to be inserted
     * @param item The item to be inserted
     * @throws IndexOutOfBoundsException if the index is out of range
     * 
     * 
     * 
     * If index is less than 0 and greater than the size throw an exception
     * If index is equal to 0 then item will be the first node
    /**
     * Insert the specified item at the specified position in the list.
     * Shifts the element currently at that position (if any) and any
     * subsequent elements to the right (adds one to their indicies)
     * @param index Index at which the specified item is to be inserted
     * @param item The item to be inserted
     * @throws IndexOutOfBoundsException if the index is out of range
     * 
     * 
     * 
     * If index is less than 0 and greater than the size throw an exception
     * If index is equal to 0 then item will be the first node
     */


    public void add(int index, Student item) {
        if(index < 0 || index > size){
            throw new IndexOutOfBoundsException();
        }
        if(index ==0){
            addFirst(item);
        }
        Node<Student> temp = head;
        for(int i= 0; i < index-1; i  ){
            temp = temp.next;
        }
        temp.next = new Node<Student>(item,temp.next);
        size  ;


    }

    /**
     * Append the specified item to the end of the list
     * @param item The item to be appended
     * @returns true (as specified by the Collection interface)
     */
    /**
     * if head is null then temp which holds item will be the first node.
     * While temp next node is not equal to null temp is equal to the next node
     * When it is equal to null the while loop will stop and a new node is created 
     * and added to the end of the list
     * @param item
     * @return 
     */
    public boolean add(Student item) {
        Student temp = item;
        if(head == null){
            addFirst(temp);
            return true;
        }
        Node<Student> temp2 = head;
        while(temp2.next != null){
            temp2 = temp2.next;
        }
        temp2.next = new Node<Student>(temp);
        size  ;
        return true;


    }
        int size() {
        return size;
    }

    /**
     * Obtain a string representation of the list
     * @return A String representation of the list 
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        Node p = head;
        if (p != null) {
            while (p.next != null) {
                sb.append(p.data.toString());
                sb.append(" ==> ");
                p = p.next;
            }
            sb.append(p.data.toString());
        }
        sb.append("]");
        return sb.toString();
    }

    /**
     * Remove the first occurence of element item.
     * @param item The item to be removed
     * @return true if item is found and removed; otherwise, return false.
     */
    public boolean remove(Student item) {
        if (head == null) {
            return false;
        }
        Node<Student> current = head;
        if (item.equals(current.data)) {
            removeFirst();
            return true;
        }
        while (current.next != null) {
            if (item.equals(current.next.data)) {
                removeAfter(current);
                return true;
            }
            current = current.next;
        }
        return false;
    }

    // Nested Class
    /** A Node is the building block for the SingleLinkedList */

}
  

Комментарии:

1. Поделитесь своей трассировкой стека

2. Было бы полезно, если бы вы опубликовали больше своего кода, особенно кода для класса Node. Также было бы полезно, если бы вы опубликовали полный текст сообщения об ошибке (я предполагаю, что это сообщение об ошибке от компилятора?).

3. @bart.s Боюсь, я не знаю, как это сделать

4. @Chris Я считаю, что Барт просто запрашивает больше доступной информации об ошибках.

5. Я прикрепил остальную часть своего кода класса LinkedList / Node

Ответ №1:

 private static class Node<Student> {
  

Это эквивалентно более традиционному

 private static class Node<T> {
  

Он объявляет общий класс узла с параметром типа T, который может быть любого типа. Итак

 private Student data;
  

Фактически объявляет поле универсального типа, которое может быть любым.

Вероятно, вы хотите, чтобы класс Node и LinkedList вообще не были общими, поскольку предполагается, что он должен содержать только учеников или должен быть объявлен как

 private static class Node<T extends Student> {
  

Комментарии:

1. Когда я меняю заголовок на <T расширяет Student>, это устраняет проблему, но нарушает все остальное

2. Вам следует изменить не только заголовок. Опять же, вы, вероятно, не хотите, чтобы классы были универсальными, поэтому вы должны просто объявить их как private static class Node и public class StudentSingleLinkedList .

3. Итак, это сработало и избавило от ошибок, но я думаю, я не совсем понимаю, почему это правильный путь? есть понимание?

4. Универсальный класс, подобный встроенному LinkedList, позволяет содержать объекты любого типа. Поэтому, если вы создаете LinkedList<String> , он может содержать только String , а если вы создаете LinkedList<Student> , он может содержать только Student . Но, конечно, поскольку он может содержать что угодно, LinkedList не может делать никаких предположений о том, что он содержит, и, следовательно, ut не может вызвать какой-либо метод Student , поскольку он может фактически содержать строки, автомобили или бананы. Ваш класс может содержать только Students; он внутренне вызывает методы Student для элементов, которые он содержит. Поэтому он не может быть универсальным: единственное, что он может содержать, это Students .

5. Если вы хотите сделать его универсальным, то у вас не может быть таких методов, как findGpa в списке, которые имеют смысл только для учащихся, а не для чего-либо еще, что делает код вообще не универсальным.