Java:使用具有通配符类型参数的类函数

Java:使用具有通配符类型参数的类函数,java,type-parameter,Java,Type Parameter,我在第(B)行得到一个编译错误,“AlphaData不能通过方法调用转换转换为CAP#1”。我的解决办法是将第(A)行的indexOf()的签名改为Object类型而不是T类型。但是,这样我就失去了类型检查。此外,如果“data”也被声明为BetaData类型,我希望第B行也能工作。有没有办法做我想做的事 public class Test { class AlphaData {} // base class for data class BetaData extends AlphaD

我在第(B)行得到一个编译错误,“AlphaData不能通过方法调用转换转换为CAP#1”。我的解决办法是将第(A)行的indexOf()的签名改为Object类型而不是T类型。但是,这样我就失去了类型检查。此外,如果“data”也被声明为BetaData类型,我希望第B行也能工作。有没有办法做我想做的事

public class Test
{
  class AlphaData {} // base class for data

  class BetaData extends AlphaData {} // subclass for data

  abstract class BasicAdapter<T> // a generic adapter
  {
    abstract int indexOf (T item); //(A)
  }

  class BetaAdapter extends BasicAdapter<BetaData> // adapter subclass with binding
  {
    int indexOf (BetaData item) { return 0; }
  }


  BasicAdapter<? extends AlphaData> adapter = null;

  Test()
  {
    AlphaData data = null;
    int index = adapter.indexOf (data); //(B) -- compile error here
  }
}
公共类测试
{
类AlphaData{}//数据的基类
类BetaData扩展了数据的AlphaData{}//子类
抽象类BasicAdapter//泛型适配器
{
抽象int indexOf(T项);/(A)
}
类BetaAdapter通过绑定扩展BasicAdapter//适配器子类
{
int indexOf(BetaData项){返回0;}
}

BasicAdapter
适配器。
索引不能安全地传递给
AlphaData
,因为它可能具体是
BasicAdapter
;虽然
数据
可能具体是
BetaData
的一个实例,但它可以是普通的
AlphaData
,或者
AlphaData
的任何其他不相关子类

要记住的首字母缩略词是PECS:

  • 生产者
    extend
  • 消费者
    super

您希望
适配器
使用
AlphaData
,因此需要
BasicAdapter
适配器。无法将
AlphaData
的索引安全地传递给
适配器,因为它可能具体是
BasicAdapter
;虽然
数据
可能具体是
BetaData
的实例,但它可能是p>lain
AlphaData
,或
AlphaData
的任何其他不相关子类

要记住的首字母缩略词是PECS:

  • 生产者
    extend
  • 消费者
    super
您希望
适配器
使用
AlphaData
,因此需要
基本适配器这是正常的

BasicAdapter<? extends AlphaData> adapter = null
您给出的是
AlphaData
参数,因此它不符合“属于
AlphaData
的内容”:例如,它可能是
BetaData

如果您希望它适用于任何
AlphaData
,只需使用:

BasicAdapter<AlphaData> adapter = null;
BasicAdapter适配器=null;
不使用通配符,或

BasicAdapter<? super AlphaData> adapter = null;
BasicAdapter这是正常的

BasicAdapter<? extends AlphaData> adapter = null
您给出的是
AlphaData
参数,因此它不符合“属于
AlphaData
的内容”:例如,它可能是
BetaData

如果您希望它适用于任何
AlphaData
,只需使用:

BasicAdapter<AlphaData> adapter = null;
BasicAdapter适配器=null;
不使用通配符,或

BasicAdapter<? super AlphaData> adapter = null;

BasicAdapter如何实例化适配器?编写的示例只允许一个实例化:new BetaAdapter()。但是它需要用于BasicAdapter的其他子类以及BetaAdapter的子类。如何实例化适配器?编写的示例只允许一个实例化:new BetaAdapter()。但是,它需要用于BasicAdapter的其他子类以及BetaAdatper的子类。