2013-05-07 132 views
0

我不是很熟悉的語法和規則的Java所以這裏是一個簡單的問題:爲什麼我必須寫:爲什麼我需要=(class)...當我已經宣佈課程時?

LayoutParams params = (LayoutParams) layout.getLayoutParams(); 

,但我不能寫:

LayoutParams params = layout.getLayoutParams(); 

在OBJ-C,我只需要編寫

UIScrollView* abc = (UIScrollView*) [self.view viewWithTag:(1)]; 

當對象從[self.view viewwithtag:(1)]返回不爲abc預期類(在這種情況下,在UIView)。

相同的邏輯是否適用於Java?如果這是真的,那意味着從layout.getLayoutParams()返回的對象不屬於類LayoutParams,這有點奇怪。

那麼,我的假設correc或Java有不同的規則?

+0

'layout'是什麼類型?它的'getLayoutParams()'返回什麼類型? – 2013-05-07 11:43:35

+0

'layout.getLayoutParams();'返回什麼?它是類'LayoutParams'還是'LayoutParams'的子類的對象? – Aashray 2013-05-07 11:45:00

+0

您可以像Objective C那樣編寫它 - 如果該方法返回了類型LayoutParams的引用。你必須施放,因爲它沒有。 – duffymo 2013-05-07 11:46:03

回答

3

你的假設是正確的。 getLayoutParams必須返回一個不是LayoutParams的子類的類。無論是方法名稱命名不清或者在不同的包中有兩個不同的類別LayoutParams。您應該調查退貨類型,並確認它始終是您使用的LayoutParams的子類別,否則您將面臨ClassCastException的風險。

1
LayoutParams params = (LayoutParams) layout.getLayoutParams(); 

這裏你通過類型轉換返回layout.getLayoutParams();LayoutParams類型的實例任何對象。這被稱爲縮小轉換。如果getLayoutParams();返回LayoutParams或其子類的實例,那麼這將起作用或將失敗。

0

簡答:您不需要。

您需要的唯一情況是,如果getLayoutParams()返回更一般的類型,並且您試圖縮小它。如果是這樣的話,那麼這個方法的名字是非常誤導性的 - 但它與Java的語法沒有任何關係。

0

你的確可以寫

LayoutParams params = layout.getLayoutParams(); 

如果layout.getLayoutParams()宣佈重返LayoutParams類型或LayoutParams子類的結果。但是,如果聲明返回一個超類(或接口)LayoutParams,即使它實際上正在返回一個LayoutParams實例,它也不起作用。在這種情況下,你將需要castLayoutParams

LayoutParams params = (LayoutParams)layout.getLayoutParams(); 
0

如果layout.getLayoutParams()方法的返回類型爲LayoutParams然後

LayoutParams params = layout.getLayoutParams(); 

這將正常工作。

但如果返回類型爲一般(假設的LayoutParams接口或超類,但是它acually返回LayoutParams的對象)中,你必須強制類型轉換爲自動向下鑄造這種情況下,是不可能在Java中,你有明確投出

LayoutParams params = (LayoutParams) layout.getLayoutParams(); 
0

不,它是如你所說:如果結果比預期的類不同,你必須改變它每(class)

在你的情況下,我相信getLayoutParams()返回ViewGroup.LayoutParams,所以你必須做(class)更改。

這裏有一個解釋到LayoutParam

0

在這裏肢體走出去,但我猜你在Android的談論View.getLayoutParams()。該方法返回ViewGroup.LayoutParams。該類文檔告訴我們它有一堆子類:AbsListView.LayoutParams,AbsoluteLayout.LayoutParamsGallery.LayoutParamsViewGroup.MarginLayoutParams,ViewPager.LayoutParams,WindowManager.LayoutParams,等等。

因此,可能發生的情況是,您粘貼的代碼範圍內的名稱LayoutParams指的是其中一個子類。 (也許你正在繼承AbsListView,或者你/ IDE爲它做了import static)。因此,你實際上必須插入演員表,因爲返回類型View.getLayoutParams()不能分配給它的任何子類,即使在運行時的實際值可能是。

這是鼠標在您的IDE中的標識符應該確認。另外:誰設計了一個涉及10個以上同類名字的API的API應該被拍攝。

0

我得到了你的疑問現在考慮以下考試:

class A 
{ 
//assume that this class contain one method which is similar to your getLayout 
public Object getObject() 
{ 
    return new A(); 
} 
} 

//現在先了解Java的一件事是,在Java中的所有類是子類對象類。現在看看這個return stmt和方法簽名,即簽名是Object,但我們正在返回一個類對象,這在java中稱爲上傳。

接着

現在

如果我們正在訪問對於A類對象此方法然後我們需要向下轉換 即 A A1 =(A)的getObject()// getObject()方法將返回對象類型,但我們使用downcast將該對象存儲到A類對象中...

相關問題