将priorityQueue转换为我的自定义界面

use*_*464 0 java

public class testCast {

    public interface dataQueue extends Queue<Object>{};

    public static void main (String test[]){        
        dataQueue queue = (dataQueue) new java.util.PriorityQueue<Object>();
        queue.add("Test");
        System.out.println(queue.peek());
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么这会导致出现错误....如果我这样做会有效

Queue queue = (Queue) new java.util.PriorityQueue<Object>(); 有谁知道为什么?提前致谢

Hen*_*ter 5

简单地说,因为a PriorityQueue是a Queue,但不是a DataQueue.实际的类定义在Java中很重要:仅仅因为两个接口相同并不意味着您可以将一个接口的任何实现转换为另一个接口.

  • DataQueue是一个扩展Queue接口的接口.
  • PriorityQueue是一个实现Queue接口的类.
    • 没有实现DataQueue接口.
  • 因此,一个PriorityQueue不能投DataQueue.

层次结构可能会使它更清晰:仅仅因为它们有一个共同的祖先并不意味着你可以将一个投射到另一个.

            Queue
      ________|________
     |                 |
 DataQueue       PriorityQueue
Run Code Online (Sandbox Code Playgroud)

为了更加迂腐吧,让我们斜坡上升的清晰度,因为之间的关系QueueDataQueue距离之间的关系不同QueuePriorityQueue.以下MSPaint图使用实线进行继承,使用虚线进行接口实现.

DataQueue继承;  PriorityQueue实现.

所以,你无法从PriorityQueue直接到达DataQueue.如果您确实希望能够出于某种原因制作PriorityQueue并调用它DataQueue,那么您可以这样做:使用新类扩展 PriorityQueue,并实现您的DataQueue界面.

public class MyQueue extends PriorityQueue<Object> implements DataQueue {
    // Anything you want goes here, or just leave it empty if you only want the default constructor.
}
Run Code Online (Sandbox Code Playgroud)

MyQueue继承自PriorityQueue,并实现DataQueue

然后你可以写下DataQueue q = new MyQueue();你心中的内容.


最后,请注意,如果您尝试从两个不同的类继承,这将不起作用.Java不支持多重继承.这种层次结构是唯一可能的,因为它是一个接口,而不是一个类.DataQueue