2016-06-16 195 views
0

IDE抱怨:「錯誤的第二個參數類型:找到布爾值,必需:?」Java參數類型錯誤

public void onItemClick(View view, int positon) { 
    HashMap<String, ?> movie = (HashMap<String, ?>) movieData.getItem(positon); 

    if(view.getId() == R.id.checkBox) { 
     boolean selection = (boolean) movie.get("selection") ? false : true; 

     // Error here 
     movie.put("selection", selection); 
    } 
} 

然而,這一個將工作

public void onItemClick(View view, int positon) { 
    HashMap movie = movieData.getItem(positon); 

    if(view.getId() == R.id.checkBox) { 
     boolean selection = (boolean) movie.get("selection") ? false : true; 

     movie.put("selection", selection); 
    } 
} 
+0

(1)在哪一行是IDE抱怨? (2)如何聲明'movieData'? – ajb

+0

你可以分享IDE抱怨和方法聲明嗎? –

+1

備註:如果'b'是任何布爾表達式,您不必說'b? false:true'; '!b'也會起作用。 – ajb

回答

1

在Java教程頁面使用Unbounded Wildcards,它指出:

需要注意的是List<Object>很重要和List<?>是不一樣的。您可以將Object或任何子類型Object插入List<Object>。但是您只能將null插入到List<?>中。 Guidelines for Wildcard Use部分有更多關於如何確定在給定情況下應該使用哪種通配符的信息(如果有的話)。

你應該考慮在這裏使用通配符的原因。如果可能,請勿使用通配符。如果您仍然需要使用它,請使用合適的Upper Bounded Wildcard,以便可以知道類型。

既然你存儲的其他數據類型之間的Boolean,唯一共同的父是Object

HashMap<String, Object> movie; 
+0

謝謝你的幫助4castle – Rangtian

0

更換線以下:

HashMap<String, Boolean> movie = (HashMap<String, Boolean>)

在仿製藥,如果你用 '?'通配符,它​​是一種稱爲未知類型的類型,這意味着您無法爲未知類型放置布爾值。希望它能爲你工作。

這是非常好的link泛型中的通配符,我會建議你閱讀一次。

+0

因爲地圖存儲了不同類型的數據,所以我不能將它聲明爲。但是,如果我使用HashMap movie = movieData.getItem(positon);它會工作 – Rangtian

+0

那真是太棒了:) :) – pbajpai21

+0

你可以用這樣的方法檢查... HashMap movie =(HashMap )movieData.getItem(positon); 我認爲你可以這樣聲明,因爲在你的方法中,你把布爾值當作值,因爲你不確定typr,那麼在右邊你可以使用通配符類型。這樣你的代碼將堅持泛型,這是很好的。 – pbajpai21

0

一般不接受原始type.It只接受Object.so你應該像Map<String,Boolean> mp = new HashMap<String,Boolean>();

+0

謝謝,因爲地圖存儲不同類型的數據,所以我不能只聲明它爲。 – Rangtian

+0

@Rangtian Yu,你可以使用HashMap 電影作爲4castle說的,或者你也可以這樣做Boolean selectedBoolean; boolean selection = =(boolean)movie.get(「selection」)?假:真; selectedBoolean =選擇;電影。把( 「選擇」,selectedBoolean); – sawyinwaimon

+0

謝謝你的幫助sawyinwaimon – Rangtian