2011-03-17 87 views
1

我有點窮,在Java或更好地說OOP的我有一個奇怪的問題,我不知道這是否可能。我有一個類Java奇怪的問題

private ArrayList<?> data; 
public A(Activity a, ArrayList<?> mStatus) 
{ 
    activity = a; 
    data = mStatus; 
    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    imageLoader = new ImageLoader(activity.getApplicationContext()); 
} 

後來我用

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View vi = convertView; 
    ViewHolder holder; 
    if (convertView == null) 
    { 
     vi = inflater.inflate(R.layout.custom_gallery, null); 
     holder = new ViewHolder(); 
     holder.text = (TextView) vi.findViewById(R.id.text); 
     holder.image = (ImageView) vi.findViewById(R.id.image); 
     holder.root = (LinearLayout) vi.findViewById(R.id.root); 
     vi.setTag(holder); 
    } 
    else 
     holder = (ViewHolder) vi.getTag(); 

    //I used this that solves my problem 
    if(data.get(position) instanceof GalleryTestParser) 
    { 
     GalleryTestParser mParser = (GalleryTestParser)data.get(position); 
     holder.text.setText(mParser.Name); 
     holder.image.setTag(mParser.galleryThumbiPad); 
     holder.root.setTag(mParser); 
     imageLoader.DisplayImage(mParser.galleryThumbiPad, activity, holder.image); 
    } 


    return vi; 
} 

編輯:在上面,我想如果數據類型GalleryTestParser,或者如果不是做別的一些其他的。

更早我試圖在構造函數中使用ArrayList<GalleryTestParser> mStatus,但這是類特定的。我想要的是,從arraylist對象不知何故,我必須知道它是什麼類型,以便我鍵入cast列表對象的類型。

這可能嗎?

+0

後整個班級,什麼是'data'的類型? – 2011-03-17 11:41:32

+0

所以你的問題是你不知道哪種類型的對象在你的ArrayList中,但是你想把它轉換成正確的類型? – RoflcoptrException 2011-03-17 11:42:04

+0

@Roflcoptr是的。我希望我可以傳遞任何類型的數組列表,然後我只會將其轉換爲該類型。 – ingsaurabh 2011-03-17 11:45:32

回答

2

要擴大StevieB的答案(並添加一捻):你可以沿着使用接口與一個唯一的密鑰,以確定哪些具體的類,你正在處理:

public abstract interface GenericParser { 
    public String getType(); 
} 

public class GalleryTestParser implements GenericParser { 
    public String getType() { 
     return "gallery"; 
    } 
} 

public A(Activity a, List<? extends GenericParser> mStatus) { 
    GenericParser item = mStatus.get(0); 
    if (item.getType().equals("gallery")) { 
     item = (GalleryTestParser)item; 
     // Do stuff with item 
    } 
} 

這避免了「的instanceof」,給您可以更好地控制處理。例如,getType()可能會在未來返回更復雜的內容,如功能列表。

理想的情況下,雖然,你可能要移動執行到GalleryTestParser,這將使得代碼更加清晰:

public abstract interface GenericParser { 
    public void execute(); 
} 

public class GalleryTestParser implements GenericParser { 
    public void execute() { 
     // Do stuff with item 
    } 
} 

public A(Activity a, List<? extends GenericParser> mStatus) { 
    GenericParser item = mStatus.get(0); 
    item.execute(); 
} 
+0

謝謝,我知道了 – ingsaurabh 2011-03-17 13:14:17

0

更改簽名

public A(Activity a, List<GalleryTestParser> mStatus) 
+0

實際上我只是在嘗試,但是這使得我的類特定於GalleryTestParser,我不希望我想要的是我必須能夠將arraylist強制更正爲 – ingsaurabh 2011-03-17 11:47:15

+0

因此,您有一些differenet解析器?做一個接口來實現它們,並在列表< HERE >中提及它。 – 2011-03-17 11:51:41

1

你需要一個instanceof操作?

if (mStatus.get(i) instanceof GalleryTestParser){ 
    GalleryTestParser parser = (GalleryTestParser) mStatus.get(i) 
} 

雖然這種做法並不好。

+0

你的方法解決了我的問題,但我正在等待一些更好的選擇BTW +1 – ingsaurabh 2011-03-17 12:06:38

3

嘗試此

public A(Activity a, List<? extends GenericParser> mStatus) 

,然後從通用基礎子類不同類型的解析器。

請注意,如果您需要使用instanceof來區分它們,您可能會做錯, 真的只有解析器需要知道它是什麼類型!

+0

替代使用instanceof:GenericParser接口可以聲明getType(),GalleryTestParser將實現並返回一些獨特的像「gallery」... – seanhodges 2011-03-17 12:46:11

+0

嗨我告訴我糟糕的oops:P你可以提供鏈接代碼示例 – ingsaurabh 2011-03-17 12:52:07