2012-02-20 5 views
2

ListDrawablesまたはStrings(画像のURLを表す)のいずれかで表示できるメソッドがAndroidアプリにあります。メソッド内の2つの汎用リストパラメータの1つ

2つのコンストラクタを作成しようとしましたが、タイプ消去エラーが発生しました。今私は一般的な引数を使用して、そのようにURLを表すStringであることをメンバでチェックしています。別のケースでは、それがDrawablesのリストであると仮定します。このようなもの:

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

これを行う方法はありますか、何とか型の安全性を維持しますか?

答えて

3

2つの別々のメソッドを使用するだけではどうですか?

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

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

タイプ消去... –

+0

画像が異なる方法で設定されている場合は、常に異なるメソッド名を使用することができます。たとえば、次のようになります。 'setImages(List images)'と 'setImagesFromStrings(List images)' –

+0

これは実際にはかなり良い考えです。なぜ私はそれを考えなかったのですか?私は実際にコンストラクタでこれを使用していますので、ダミーのパラメータを使用してオーバーロードします。型安全性の問題を解決しました。 –

1

いいえ、それを行う本当の方法はありません。

興味深い解決策がありましたhere、私はあなたのためにそれを適用するとは思わない。

Personnally、私はあなたの問題を解決するためのより良いオブジェクト指向の方法は、あなたが探している方法を提供し、中間のインタフェースを持っているだろう

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

のようなメソッドのパラメータとしてクラスを渡すことを好みます、あなたはあなたのクラスで行う必要があるものは何でもあなたを許可するように意図され、非常にやり過ぎながら、これは、もちろん、このソリューションの

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; 
    } 
} 

何か他のものにStringをラップするためにあなたを強制します。

+0

に...それはやり過ぎのビットを思わず、私はおそらくそれを使用することはありませんが、少なくとも型の安全性がそのように1 –

+1

はい、あなたはスリックいずれかのタイプの安全なソリューションではありませんを求め保存されています) – Jack

+0

haha​​ ...コメントも+1 –

関連する問題