0
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());
    }
}

I am wondering why this would cause a casting error.... it would work if I do

Queue queue = (Queue) new java.util.PriorityQueue<Object>(); Does anyone know why?? Thanks in advance

4

1 回答 1

5

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

  • DataQueue是扩展接口的Queue接口。
  • PriorityQueue是一个实现Queue接口的类。
    • 实现DataQueue接口。
  • 因此, aPriorityQueue不能强制转换为DataQueue

层次结构可能更清楚:仅仅因为它们有一个共同的祖先并不意味着您可以将一个转换为另一个。

            Queue
      ________|________
     |                 |
 DataQueue       PriorityQueue

为了更加迂腐,让我们提高清晰度,因为Queueand之间DataQueue的关系不同于 and 之间的Queue关系PriorityQueue。下面的 MSPaint 图使用实线表示继承虚线表示接口实现

数据队列继承; PriorityQueue 实现。

所以,你不能从 aPriorityQueue直接到 a DataQueue。如果出于某种原因您确实希望能够创建 aPriorityQueue并将其称为 a ,那么您可以这样做:扩展一个新类,并实现您的接口。DataQueue PriorityQueueDataQueue

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.
}

MyQueue继承自PriorityQueue,并实现DataQueue

然后你就可以随心所欲地写信DataQueue q = new MyQueue();了。


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

于 2013-10-23T22:54:49.173 回答