[英]why do I need = (class) … when I already declared the class?
我對Java的語法和規則不是很熟悉,所以這里有個簡單的問題:為什么我要寫:
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嗎? 如果為true,則意味着從layout.getLayoutParams()
返回的對象不屬於LayoutParams
類,這layout.getLayoutParams()
。
那么我的假設是正確的還是Java有不同的規則?
您的假設是正確的。 getLayoutParams
必須返回的類不是LayoutParams
的子類。 方法名稱命名不正確,或者在不同的程序包中有兩個不同的LayoutParams
類。 您應該調查返回類型是什么,並確認它始終是您正在使用的LayoutParams
的子類,否則您將冒ClassCastException
風險。
LayoutParams params = (LayoutParams) layout.getLayoutParams();
在這里,您layout.getLayoutParams();
由layout.getLayoutParams();
返回的任何對象進行類型轉換layout.getLayoutParams();
到LayoutParams
類型的實例。 這稱為縮小轉換。 如果getLayoutParams();
返回LayoutParams
類或其子類的實例,則該實例將起作用或失敗。
簡短的答案:您不需要。
唯一需getLayoutParams()
情況是,如果getLayoutParams()
返回一個更通用的類型,而您正在嘗試縮小它的范圍。 如果是這樣的話,那么該方法的名稱將極具誤導性-但與Java的語法無關。
你確實可以寫
LayoutParams params = layout.getLayoutParams();
如果layout.getLayoutParams()
聲明返回類型的結果LayoutParams
,或子類LayoutParams
。 但是,如果聲明要返回LayoutParams
的超類(或接口),即使它實際上正在返回LayoutParams
實例,也無法使用。 在這種情況下,您需要cast
其LayoutParams
為LayoutParams
:
LayoutParams params = (LayoutParams)layout.getLayoutParams();
如果layout.getLayoutParams()
方法的返回類型為LayoutParams
則
LayoutParams params = layout.getLayoutParams();
這樣就可以了。
但是,如果返回類型是常規類型(假設LayoutParams
的接口或超類,但它會敏銳地返回LayoutParams
的對象),則在這種情況下,您必須鍵入強制類型轉換,因為在Java中無法進行自動向下強制轉換,並且必須顯式進行強制類型轉換 。
LayoutParams params = (LayoutParams) layout.getLayoutParams();
不,正如您所說:如果結果與期望的類不同,則必須按(class)
進行更改。
對於您的情況,我相信getLayoutParams()
返回ViewGroup.LayoutParams,因此您必須進行(class)
更改。
這是LayoutParam的說明
到這里View.getLayoutParams()
,但我猜你在談論Android中的View.getLayoutParams()
。 該方法返回一個ViewGroup.LayoutParams
。 該類的文檔告訴我們它有很多子類: AbsListView.LayoutParams,
AbsoluteLayout.LayoutParams
, Gallery.LayoutParams
, ViewGroup.MarginLayoutParams
, ViewPager.LayoutParams
, WindowManager.LayoutParams
等等。
因此,可能發生的情況是,您粘貼的代碼范圍內的名稱 LayoutParams
引用了這些子類之一。 (也許您繼承了AbsListView
,或者您/ IDE為其執行了import static
。)因此您實際上必須插入演員表,因為View.getLayoutParams()
的返回類型不能分配給它的任何類型。子類,即使在運行時實際值也可能是。
這是鼠標懸停在IDE中應確認的標識符上的事情。
順便說一句:設計包含10個以上具有完全相同名稱的類的API的人應該被槍殺。
我懷疑您現在考慮以下考試:
class A
{
//assume that this class contain one method which is similar to your getLayout
public Object getObject()
{
return new A();
}
}
//現在首先了解一下Java中的一件事,即Java中的每個類都是Object類的子類。 現在來看一下返回的stmt和方法簽名,即簽名是Object,但是我們返回的是一個類對象,在Java中被稱為向上轉換。
下一個
現在,如果我們正在為A類對象訪問此方法,則我們需要向下轉換,即a a1 =(A)getObject()// getObject()方法將返回Object類型,但是我們使用向下轉換將該對象存儲到A類對象中。 ..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.