【问题标题】:Java abstract class Implementing with genericsJava抽象类用泛型实现
【发布时间】:2016-05-18 19:22:57
【问题描述】:

我有一个带有泛型 (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)和单元类实现:

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 中的错误?

【问题讨论】:

  • 假设可以传递给ConcreteAdapter.setData 的唯一Cell 对象是ConcreteAdapter.Cell 是错误的。如果我对静态类型为 AbstractAdapter 的对象进行虚拟调用并传入不同的 Cell 对象怎么办?
  • @aioobe,你是对的,但在我的情况下,这些具体的适配器使用本地化并且它们彼此隔离。
  • 编译器不知道这一点。

标签: java generics abstract-class


【解决方案1】:

这是一个非常棘手的情况,因为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 移到顶级课程中。

【讨论】:

  • 欢迎您 :) ? 通配符困扰着我,所以我稍微改进了代码。您可以在更新的答案中看到如何摆脱这些。
猜你喜欢
  • 1970-01-01
  • 2012-12-10
  • 2020-05-14
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多