用泛型实现Java抽象类
我有一个带有泛型(T1)的抽象类,它扩展了我的可过滤接口:用泛型实现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; //... }
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是否可以在不强制转换的情况下将字段类型从可扩展类更改为泛型类?或者它是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使它再次工作。然而,这是非常复杂的。如果可能的话,我会将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;
}
//...
}