2012-02-20 39 views
2

兩個通用的解釋參數我在我的Android應用程序,可以從DrawablesStrings一個List任一顯示器(表示圖像的URL)的方法。一個在方法

我試圖做出兩個構造函數,但得到了類型擦除錯誤。現在我正在使用一個泛型參數,並檢查一個成員是否是表示URL的字符串,就像這樣。在另一種情況下,我假設它將是一個Drawable列表。事情是這樣的:

setImages(List<?> images) { 
    this.images = images; 
    if (String.class.isInstance(images.get(0))) { 
     isImageUrl = true; 
    } 
} 

有沒有辦法做到這一點比較好,不知何故保存類型安全?

回答

3

爲什麼不只是使用兩種不同的方法?

void setImages(List<Drawable> images) { 
// do something 
} 

void setImagesFromStrings(List<String> images) { 
// do something else 
} 
+0

類型擦除... – 2012-02-20 14:15:25

+0

你可以總是有不同的方法名稱,如果他們以不同的方式設置圖像,例如'setImages(列表圖片)'和'setImagesFromStrings(列表圖片)' – 2012-02-20 14:18:55

+0

這實際上是個不錯的主意。現在爲什麼我沒有想到這一點......我實際上是在構造函數中使用它,所以我將通過使用僞參數來重載它。解決了類型安全保留問題。 – 2012-02-20 14:28:10

1

不,沒有真正的方法來做到這一點。

有一些有趣的解決方案here,但我認爲它不適用於你。

Personnally,我更願意把類像

setImages(List<? extends T> images, Class<T> clazz) { 
    this.images = images; 
    if (clazz == String.class )) { 
     isImageUrl = true; 
    } 
} 
1

的方法的參數更好的面向對象的方式來解決你的問題是有一箇中間接口,提供你正在尋找的方法,但是這將迫使你換String到別的

interface Displayable { 
    public boolean isRealImage(); 
} 

class StringImage implements Displayable { 
    public String name; 
    public boolean isRealImage() { return false; } 
} 

class DrawableImage implements Displayable { 
    public Drawable drawable; 
    public boolean isRealImage() { return true; } 
} 

setImages(List<? implements Displayable> images) { 
    this.images = images; 
    if (images.get(0).isRealImage()) { 
     isImageUrl = true; 
    } 
} 

當然這種解決方案的東西,而相當矯枉過正,是爲了讓你任何你需要與你的類來完成。

+0

它確實似乎有點矯枉過正,我可能不會使用它,但至少類型安全能得到保障,從而+1 – 2012-02-20 14:17:59

+1

是的,你問一個類型安全的解決方案不是一個漂亮的一個。在一個像Java這樣的冗長的語言,他們通常在對映; – Jack 2012-02-20 14:21:56

+0

哈哈... +1的評論以及 – 2012-02-20 14:24:03

相關問題