java - Java错误: Cannot find symbol - but method is in the data type class

标签 java compiler-errors symbols

尝试编译播放列表类时收到以下错误:

 Playlist.java:164: error: cannot find symbol
     head.data.play();
            ^
  symbol:   method play()
  location: variable data of type Music

音乐数据类型类:
import java.net.MalformedURLException;
import java.net.URL;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerException;

public class Music extends MediaData
{
// Data Fields
/** The name of the artist displayed */
private String artist;
/** The disk directory to a music file */
private String mediaFilePath;
/** Enables audio music to be played */
private BasicPlayer player = new BasicPlayer();

// Constructor for a music media type
public Music(String t, String a)
{
    super.setTitle(t);
    setArtist(a);
    getPlayCount();
    getMediaFilePath();
} 

// mutator and accessor methods removed for space

/** Locates the media file on disk */
public String getMediaFilePath()
{
    mediaFilePath = System.getProperty("user.dir") + "/Music Library/" +    
                                    getArtist() + "-" + getTitle() + ".mp3";
    return mediaFilePath;
}

/** Plays a music file */
public void play()
{
    try 
    {
        player.open(new URL("file:///" + getMediaFilePath()));
        player.play();
    } 
    catch (BasicPlayerException | MalformedURLException e)
    {
        e.printStackTrace();
    }
   }    
 }

在驱动程序中测试时,此类中的play方法可以正常工作。但是,当我尝试从播放列表类中的播放方法访问它时,其中播放列表是具有Music数据类型节点的双LinkedList,出现上述错误:
import java.net.MalformedURLException;
import java.net.URL;
import javazoom.jlgui.basicplayer.BasicPlayer;
import javazoom.jlgui.basicplayer.BasicPlayerException;
import java.util.*;

public class Playlist<Music> extends MediaData
{
// Data fields
/** The playlist queue */
private LinkedList<Music> musicList;
/** The list head */
private Node<Music> head;


/** A Node is the building block for a single-linked list. */
private static class Node<Music> 
{

// Data Fields

/** The reference to the data. */
private Music data;
/** The reference to the next node. */
private Node<Music> next;
/** The reference to the previous node. */
private Node<Music> prev;

// Constructors
/**
* Creates a new node with null next and previous fields.
* @param dataItem The data stored
*/
private Node(Music dataItem)
{
     data = dataItem;
     next = null;
     prev = null;
}

/**
 * Creates a new node that references another node.
 * @param dataItem The data stored
 * @param nodeRef The node referenced by new node
 */
    private Node(Music dataItem, Node<Music> prevNode)
    {
        Node<Music> afterPrevNode = prevNode.next;
        Node<Music> node = new Node(dataItem);

        prevNode.next = node;
        prevNode.prev = node;

        node.prev = prevNode;
        node.next = afterPrevNode;
    }
} //end class Node

// Constructor
public Playlist(String t)
{
    super.setTitle(t);
    musicList = new LinkedList<Music>();
}

/**
 * Adds a new node to the end of a list.
 * @param head The head of the current list
 * @param data The data for the new node
 */
private void add(Node<Music> head, Music data) 
{
    // If the list has just one element, add to it.
    if (head.next == null) 
    {
        Node<Music> node = new Node<Music>(data);
        head.next = node;
        node.prev = head;
    } 
    else 
    {
        add(head.next, data);
    }
}

/**
 * Wrapper method for adding a new node to the end of a list.
 * @param data The data for the new node
 */
public void add(Music data) 
{
    if (head == null) 
    {
        head = new Node<Music>(data);
    } 
    else 
    {
        add(head, data);
    }
}

/**
 * Wrapper method for removing a node.
 * @post The first occurrence of outData is removed.
 * @param outData The data to be removed
 * @return true if the item is removed,
 *         and false otherwise
 */
public boolean remove(Music song)
{
    boolean result;
    if (head == null) 
    {
        result = false;
    } 
    else 
    {
        result = remove(head.next, head, song);
    }
    return result;
}

/**
 * Removes a node from a list.
 * @post The first occurrence of outData is removed.
 * @param head The head of the current list
 * @param pred The predecessor of the list head
 * @param outData The data to be removed
 * @return true if the item is removed
 *         and false otherwise
 */
private boolean remove(Node<Music> head, Node<Music> pred, Music song) 
{
    boolean result;
    if (head == null)
    {
        result = false;
    } 
    else if (head.data.equals(song)) 
    {
        pred.next = head.next;
        pred.prev = null;
        head = pred;
        result = true;
    } 
    else 
    {
        result = remove(head.next, head, song);
    }
    return result;
}

/** Plays a playlist
 *    @param head The song to be played */
private void play(Node<Music> head)
{
    if (head != null)
    {
         head.data.play();
         play(head.next);
    }
}

/** Wrapper method that plays a playlist */
public void play()
{
    if (head != null)
    {
         head.data.play();
         play(head.next);
    }
}

public void pause()
{

}

/**
 * Finds the size of a list.
 * @param head The head of the current list
 * @return The Size of the Current List
 */
private int size(Node<Music> head) 
{
    if (head == null) 
    {
        return 0;
    } 
    else 
    {
        return 1 + size(head.next);
    }
}

/**
 * Wrapper method for finding the size of a list.
 * @return The size of the list
 */
public int size() 
{
    return size(head);
}

/**
 * Returns the string representation of a list.
 * @param head The head of the current list
 * @return The state of the current list
 */
private String toString(Node<Music> head) 
{
    if (head == null) 
    {
        return "";
    } 
    else 
    {
        return head.data + "\n" + toString(head.next);
    }
}

/**
 * Wrapper method for returning the string representation of a list.
 * @return The string representation of the list
 */
@Override
public String toString() 
{
    return toString(head);
}

/**
* Checks if the list is empty
* @return true if empty, false otherwise
*/
public boolean empty()
{
    boolean result = false;
    if (head == null)
    {
    result = true;
    }
    return result;
}

/** Adds a node before another node.
    @param prevNode The node before node
    @param node The node the item will be inserted before
    @param item The data stored in the node
*/
public void insertBefore(Node prevNode, Music nodeData, Music data)
{            
    if (prevNode.next.data == nodeData)
    {
        Node<Music> prevPrevNode = prevNode.prev;
        Node<Music> node = new Node<Music>(data);

        prevPrevNode.next = node;
        prevNode.prev = node;

        node.prev = prevNode.prev;
        node.next = prevNode;
    }
    else
    {
        insertBefore(prevNode.next, nodeData, data); 
    }
}

/** Wrapper class that adds a node before another node.
    @param node The node the item will be inserted before
    @param item The data stored in the node
*/
public void insertBefore(Music nodeData, Music data)
{            
    if (nodeData == head.data)
    {
        addAtHead(data);
    }
    else
    {
        insertBefore(head.next, nodeData, data); 
    }
}

/** Adds a node after another node.
    @param head The head node
    @param nodeData The node the item will be inserted before
    @param data The data stored in the node
*/
public void insertAfter(Node head, Music nodeData, Music data)
{            
    if (nodeData == head.data)
    {
        Node<Music> node = new Node<Music>(data);
        Node<Music> afterHead = head.next;

        node.next = afterHead.next;
        head.next = node;
        node.prev = head;
        afterHead.prev = node;
    }
    else
    {
        insertAfter(head.next, nodeData, data); 
    }
}

/** Wrapper class that adds a node after another node.
    @param nodeData The node the item will be inserted after
    @param data The data stored in the node
*/
public void insertAfter(Music nodeData, Music data)
{
    insertAfter(head, nodeData, data); 
}

/** Adds a node to the front of the list
 *    @param head The front of the list
 *    @param Music The data added
 */
public void addAtHead(Music data)
{
    if (empty())
    {
        head = new Node<Music>(data);
    }
    else
    {
        Node<Music> node = head;
        head = new Node<Music>(data);
        head.next = node;
        node.prev = head;
    }
}

/** Adds a node to the list
 *    @param head The front of the list
 *    @param Music The data added
 */
public void addAtEnd(Node head, Music data)
{
    Node<Music> node;
    if (head.next == null)
    {
        node = new Node<Music>(data);
        head.next = node;
        node.prev = head;
    }
    else
    {
        node = head.next;
        addAtEnd(node, data);
    }
}

/** Wrapper method to add a node to the list
 *    @param Music The data added
 */
public void addAtEnd(Music data)
{
    if (empty())
    {
        head = new Node<Music>(data);
    }
    else
    {
        addAtEnd(head, data);
    }
}

/**
* Return the data of the first Node
* @return The data of the first Node
*/
public Music peekFront()
{
    Music m;
    if (empty()) 
    {
        m = null;
    } 
    else 
    {
        m = head.data;
    }
    return m;
}

/**
* Return the data of the last Node
* @return The data of the last Node
*/

public Music peekEnd(Node<Music> head)
{
    Music m;
    if (head.next != null)
    {
        Node<Music> node = head.next;
        peekEnd(node);
        m = node.data;
    }
    else
    {
        m = head.data;
    }

    return m;
}

/**
* Wrapper method for the data of the last Node
* @return The data of the last Node
*/

public Music peekEnd()
{
    Music m;
    if (head == null)
    {
        m = null;
    } 
    else 
    {
        m = peekEnd(head);
    }
    return m;
}

/** Remove the first node from the list
    @returns The data from the removed node, or null if the list is empty
*/
public Music removeFront()
{
    Music m = null;
    Node<Music> temp = head;
    Node<Music> afterHead = head.next;
    if (head != null)
    {
        m = temp.data;
        head = head.next;
        afterHead.prev = head;

    }
    return m;
}

/** Remove the last node from the list
 * @param head The head of the current list
 * @return The data from the removed node, or null if the list is empty
 */
public Music removeEnd(Node<Music> head)
{
    Music m;
    if (head.next != null)
    {
        Node<Music> node = head.next;
        removeEnd(node);
        m = node.data;
        node.next = null;
    }
    else
    {
        m = head.data;
        head = null;
    }

    return m;
 }

/**
 * Wrapper method for removing the last Node
 * @return The data from the removed node, or null if the list is empty
 */
public Music removeEnd()
{
    Music m;
    if (head == null)
    {
        m = null;
    } 
    else 
    {
        m = removeEnd(head);
    }
    return m;
 }

 } // End of class

音乐课中有一个播放方法,所以我不明白为什么会出现此错误。此类的早期版本(播放列表未实现为LinkedList)没有此问题。请告知如何补救

最佳答案

这是因为在Node类中,Music是模板类型参数,而不是类名,并且与通常使用的符号T没有区别。您可能会收到警告“类型参数音乐正在隐藏类型音乐”的警告。编译器不知道变量data的类是Music类的对象。您应该删除<Music>类的Node
您可以这样编写Node类:

private static class Node
{

    // Data Fields

    /** The reference to the data. */
    private Music data;
    /** The reference to the next node. */
    private Node next;
    /** The reference to the previous node. */
    private Node prev;

    // Constructors
    /**
    * Creates a new node with null next and previous fields.
    * @param dataItem The data stored
    */
    private Node(Music dataItem)
    {
         data = dataItem;
         next = null;
         prev = null;
    }

/**
 * Creates a new node that references another node.
 * @param dataItem The data stored
 * @param nodeRef The node referenced by new node
 */
    private Node(Music dataItem, Node prevNode)
    {
        Node afterPrevNode = prevNode.next;
        Node node = new Node(dataItem);

        prevNode.next = node;
        prevNode.prev = node;

        node.prev = prevNode;
        node.next = afterPrevNode;
    }
} 

关于java - Java错误: Cannot find symbol - but method is in the data type class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22678654/

相关文章:

javascript - 为什么我不能将 Symbol.hasInstance 分配给函数?

java - 如何获得 Wicket 口 反馈 消息计数

java - 如何通过 Spark 提交 Spark Streaming 应用程序

JAVA-错误: cannot find symbol -- haven't found answer on site yet

ios - Xcode 8 beta - 由于信号 : Segmentation Fault 11 而导致命令失败

javascript - Python 相当于 JS `Symbol` ?

ruby - 为什么哈希中的这个字符串键转换为符号?

java - 如何在没有 jar 依赖的 Gradle 中创建共享项目

java - 无法在 hibernate 和 spring mvc 中添加或更新外键

node.js - 当我尝试将代码作为字符串发送到jdoodle编译器api时出现错误