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());
}
}我想知道为什么这会导致一个铸造错误..。如果我这么做的话
Queue queue = (Queue) new java.util.PriorityQueue<Object>();,有人知道为什么吗??提前感谢
发布于 2013-10-23 22:54:49
简单地说,因为PriorityQueue是Queue,而不是DataQueue。在Java中,实际的类定义很重要:仅仅因为两个接口是相同的,并不意味着您可以将其中一个的任何实现转换到另一个。
DataQueue是一个扩展Queue接口的接口。PriorityQueue是一个实现Queue接口的类。DataQueue接口。
PriorityQueue转换为DataQueue。层次结构可能会让它变得更清楚:仅仅因为它们有一个共同的祖先,并不意味着您可以将其中一个转换为另一个。
Queue
________|________
| |
DataQueue PriorityQueue为了更好地理解这一点,让我们来提高一下清晰度,因为Queue和DataQueue之间的关系不同于Queue和PriorityQueue之间的关系。下面的MSPaint图使用实线表示继承,而虚线用于接口实现。

因此,您不能直接从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.
}

然后你就可以把DataQueue q = new MyQueue();写得心满意足了。
最后,请注意,如果您试图从两个不同的类继承,这是行不通的。Java不支持多重继承。这种层次结构之所以可能,是因为DataQueue是一个接口,而不是一个类。
https://stackoverflow.com/questions/19553743
复制相似问题