2013-10-23 70 views
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()); 
    } 
} 

我很奇怪,爲什麼這會導致鑄造錯誤.... 如果我做投的PriorityQueue到我的定製界面

它會工作

Queue queue = (Queue) new java.util.PriorityQueue<Object>(); 有誰知道爲什麼? 在此先感謝

+3

Java不支持[duck typing](http://en.wikipedia.org/wiki/Duck_typing)。 – Jeffrey

回答

5

簡而言之,因爲PriorityQueueQueue,但不是DataQueue。實際的類定義在Java中很重要:僅僅因爲兩個接口是相同的,並不意味着你可以將任何一個實現施加給另一個接口。

  • DataQueue是擴展Queue接口的接口。
  • PriorityQueue是一個實現Queue接口的類。
    • 不是實現DataQueue接口。
  • 因此,PriorityQueue不能轉換爲DataQueue

層次結構可能會更清楚:僅僅是因爲他們有一個共同的祖先,並不意味着你可以投一個到另一個。

  Queue 
     ________|________ 
    |     | 
DataQueue  PriorityQueue 

要更加迂腐吧,讓我們斜坡上升的清晰度,因爲QueueDataQueue之間的關係是從QueuePriorityQueue之間的關係不同。以下MSPaint圖使用實線繼承用於接口實現的虛線

DataQueue inherits; PriorityQueue implements.

所以,你不能從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. 
} 

MyQueue inherits from PriorityQueue, and implements DataQueue

然後,你可以寫DataQueue q = new MyQueue();你的心臟的內容。


最後,請注意,這是行不通如果從兩個不同的類試圖繼承。 Java不支持多重繼承。這個層次結構是唯一可能的,因爲DataQueue是一個接口,而不是一個類。

+0

那麼有沒有辦法讓它工作? – user2913464

+0

你可以簡單地通過擴展'PriorityQueue'來實現'DataQueue':'MyQueue extends PriorityQueue implements DataQueue {}'然後你可以像這樣創建一個:'DataQueue q = new MyQueue();'但是更重要的問題你應該問自己是,你爲什麼要這樣做?有可能比所有這些複雜的類型糖化更簡單的解決方案。 –

+0

壯觀的答案! –