Java抽象类用泛型实现

Air*_*ner 3 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);

    //...
}
Run Code Online (Sandbox Code Playgroud)

我有带有方法 (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
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

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

T1信息;

但不是

可过滤的信息;

是否可以在不进行强制转换的情况下将字段类型从可扩展更改为通用类?还是IDE中的错误?

Tam*_*Rev 5

这是一个非常棘手的情况下,因为AbstractAdapter是在原AbstractAdapter.Cell。如果您指定了足够的类型,那么您就不再需要演员表了:

public abstract class AbstractAdapter < T1 extends Filterable, T2 extends AbstractAdapter<T1, T2>.Cell > extends ArrayAdapter < T1 > {
    //...
}
Run Code Online (Sandbox Code Playgroud)

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

    //...
}
Run Code Online (Sandbox Code Playgroud)

使它再次工作。然而,它非常复杂。如果可能,我会将 Cell 移至顶级课程。