簡體   English   中英

當我已經聲明了類時,為什么需要=(class)…?

[英]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實例,也無法使用。 在這種情況下,您需要castLayoutParamsLayoutParams

 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.LayoutParamsGallery.LayoutParamsViewGroup.MarginLayoutParamsViewPager.LayoutParamsWindowManager.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM