2016-04-10 21 views
1

我有一個ArrayDeque,ArrayDeque<Double> monthlyFibs,我初始化了Queue<Double> monthlyFibs = new ArrayDeque<Double>();爲什麼使用ArrayDeque/Queue java獲取未定義類型?

然而,當我去打電話給我的功能,public ArrayDeque<Double> monthlyPivotBy3Fibonacci(String[][] contents, DecimalFormat df, double fib_constant, ArrayDeque<Double> monthlyFibs),在主,像

dp.monthlyPivotBy3Fibonacci(contents, df, 1.00616, monthlyFibs);我得到一個錯誤,指出消息:

The method monthlyPivotBy3Fibonacci(String[][], DecimalFormat, double, 
ArrayDeque<Double>) in the type DataProcess is not applicable for the arguments 
(String[][], DecimalFormat, double, Queue<Double>) DataProcess.java line 530 
    Java Problem 

我認爲問題在於,因爲monthlyFibs與申報Queue<Double>,但是當我通過monthlyFibs作爲Queue<Double>時,我無法使用功能push()。我收到錯誤消息:

The method push(double) is undefined for the type Queue<Double> 

這是怎麼回事?我使用eclipse(Java),它建議我在主要調用變量時將該變量作爲Queue<double>。這是做到這一點的唯一方法嗎?

回答

2

可以申報monthlyFibs類型爲Deque<Double>而不是Queue<Double>

Deque<Double> monthlyFibs = new ArrayDeque<Double>(); 

,改變方法簽名:

public Deque<Double> monthlyPivotBy3Fibonacci(String[][], DecimalFormat, double, Deque<Double>) 

這解決了編制問題。

方法push在接口Deque中定義,但在Queue中定義,因此編譯問題。 請注意,Deque繼承自Queue,因此ArrayDeque實現了這兩個接口。

使用特定實現ArrayDeque作爲方法參數類型/返回值類型很少有意義,因爲在這種情況下,您將限制該方法使用一個特定實現,而該方法可能適用於任何實現Deque

+1

好吧,我將這樣做。那麼有什麼理由通過'Queue '聲明呢?我在飛行中學習Java,這就是其他網站寫了多少個。 –

+0

@NickPredey,建議在類型聲明中使用接口,否則你只能將自己侷限於一個特定的實現。就你而言,這個建議仍然有效,你只是使用了錯誤的界面:你應該使用'Deque',但你使用'Queue'。自從接口'Deque'繼承'Queue'後,你可能會感到困惑。 –

+0

就是這樣。關於如何正確使用java中的不同數據結構,我還沒有讀足夠的內容。 –

2

ArrayDeque繼承隊列,所以ArrayDeque是一個隊列,但相反是不正確的一個隊列不是一個ArrayDeque。

所以,你只需要申報monthlyFibs作爲ArrayDeque<Double>

相關問題