用泛型实现Java抽象类

用泛型实现Java抽象类,java,generics,abstract-class,Java,Generics,Abstract Class,我有一个带有泛型(T1)的抽象类,它扩展了我的可过滤接口: public abstract class AbstractAdapter < T1 extends Filterable, T2 extends AbstractAdapter.Cell > extends ArrayAdapter < T1 > { public abstract class Cell { public T1 info; //... }

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

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

    //...
}
公共抽象类AbstractAdapter扩展ArrayAdapter{
公共抽象类单元{
公共信息;
//...
}
公共抽象空集合数据(T2单元,int位置);
//...
}
我有具体的类和方法(setData)以及单元类实现:

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扩展了AbstractAdapter{ 公共类单元格扩展了AbstractAdapter.Cell{ //... } @凌驾 公共void setData(单元格,int位置){ InfoClass info=(InfoClass)cell.info;//需要从Filterable转换为InfoClass(为什么?),或者我有编译错误 } //... } 所以,我有一个ConcreteAdapter类,第一个泛型类是InfoClass(它扩展了Filterable),在方法setData中我有Cell类对象,但字段“info”我认为是Filterable,而不是InfoClass。我认为,字段“info”已经应该是泛型类型,因为它声明为

T1信息

但不是

可过滤信息


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

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

public abstract class AbstractAdapter < T1 extends Filterable, T2 extends AbstractAdapter<T1, T2>.Cell > extends ArrayAdapter < T1 > {
    //...
}
公共抽象类AbstractAdapter扩展ArrayAdapter{
//...
}

公共类ConcreteAdapter扩展了AbstractAdapter{ 公共类单元格扩展了AbstractAdapter.Cell{ //... } @凌驾 公共void setData(单元格,int位置){ InfoClass info=cell.info; } //... }
使它再次工作。然而,这是非常复杂的。如果可能的话,我会将Cell移动到一个顶级类中。

可能的重复假设唯一可以传递给
ConcreteAdapter.setData
Cell
对象是
ConcreteAdapter.Cell
是错误的。如果我对一个静态类型为
AbstractAdapter
的对象进行虚拟调用,并传入另一个
单元格
对象,该怎么办?@aioobe,你说得对,但是在我的例子中,这些具体的适配器使用localy,并且彼此隔离。但是编译器不知道这一点。欢迎:)通配符一直困扰着我,所以我对代码进行了一些改进。你可以在更新的答案上看到如何摆脱这些问题。
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; 
    }

    //...
}