应用于方法参数的通用类型 - 避免类型擦除

时间:2017-05-17 16:23:04

标签: java generics

public static abstract class ViewHolder<T> extends RecyclerView.ViewHolder {
    public ViewHolder(View itemView) {
        super(itemView);
    }

    public abstract void bindItem(T item);
}

有没有办法确保bindItem(T item)参数T正好是T而不是Object? (因为Type erasure将方法参数类型T替换为Object,因为它是无界的。)

更新 - 意外原始类型用法

这就是我最终实现抽象类的方法:

static class EventHolder extends ViewHolder {

    @Override
    public void bindItem(Object item) {

    }
}

导致bindItem参数类型为Object,因为ViewHolder的raw type已经过子类化。

应该是

static class EventHolder extends ViewHolder<Event> {

    @Override
    public void bindItem(Event item) {

    }
}

强制使用正确的参数类型。

对不起。深夜编码=愚蠢的错误。

1 个答案:

答案 0 :(得分:0)

您可以将泛型类型缩小到所需的范围,例如:

public static abstract class ViewHolder<T extends SuperItem>
   ...
}

因此,如果存在非声明类型的对象,则此类中的任何位置都会收到编译时警告。