方法中的两个通用列表参数之一

时间:2012-02-20 14:04:43

标签: java android generics

我的Android应用中有一种方法可以显示List DrawablesStrings(代表图片网址)。

我尝试制作两个构造函数但得到了类型擦除错误。现在我使用泛型参数并检查成员是否为表示URL的String,就像这样。在备选案例中,我假设它将是一个Drawables列表。像这样:

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

有没有办法更好地做到这一点,以某种方式保持类型安全?

3 个答案:

答案 0 :(得分:3)

为什么不使用2种不同的方法?

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

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

答案 1 :(得分:1)

不,没有真正的方法可以做到这一点。

有一些有趣的解决方案here,但我不认为它适用于你。

在个人情况下,我更喜欢将类作为方法的参数传递给

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

答案 2 :(得分: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;
    }
}

当然,这个解决方案虽然相当矫枉过正,但它可以让您随心所欲地完成课程。