Java抽象类使用泛型实现

时间:2016-05-18 10:57:47

标签: java generics abstract-class

我有一个带泛型(T1)的抽象类,它扩展了我的Filterable接口:

public abstract class AbstractAdapter < T1 extends Filterable, T2 extends AbstractAdapter.Cell > extends ArrayAdapter < T1 > {

    public abstract class Cell {
        public T1 info;
        //...
    }

    public abstract void setData(T2 cell, int position);

    //...
}

我有方法(setData)和Cell类实现的具体类:

public class ConcreteAdapter extends AbstractAdapter < InfoClass, ConcreteAdapter.Cell > {

    public class Cell extends AbstractAdapter.Cell {
        //...
    }

    @Override
    public void setData(Cell cell, int position) {
        InfoClass info = (InfoClass)cell.info; // need to cast from Filterable to InfoClass (why?). Or i have compilation error
    }

    //...
}

所以,我有第一个泛型类的ConcreteAdapter类作为InfoClass(扩展了Filterable),在方法setData中我有Cell类对象,但是字段“info”我看作是Filterable而不是InfoClass。我认为,字段“info”已经应该是泛型类型,因为它声明为

  

T1信息;

但不是

  

可过滤的信息;

是否可以在没有强制转换的情况下将字段类型从可扩展类更改为泛型类?或者它是IDE中的一个错误?

1 个答案:

答案 0 :(得分:4)

这是一个非常棘手的案例,因为AbstractAdapterAbstractAdapter.Cell中是原始的。如果指定了足够的类型,则不再需要强制转换:

public abstract class AbstractAdapter < T1 extends Filterable, T2 extends AbstractAdapter<T1, T2>.Cell > extends ArrayAdapter < T1 > {
    //...
}

public class ConcreteAdapter extends AbstractAdapter < InfoClass, ConcreteAdapter.Cell > {

    public class Cell extends AbstractAdapter<InfoClass, ConcreteAdapter.Cell>.Cell {
        //...
    }

    @Override
    public void setData(Cell cell, int position) {
        InfoClass info = cell.info; 
    }

    //...
}

让它再次运作。但是,它非常复杂。如果可能的话,我会将Cell移到顶级课程中。