Java:使用具有通配符类型参数的类函数
我在第(B)行得到一个编译错误,“AlphaData不能通过方法调用转换转换为CAP#1”。我的解决办法是将第(A)行的indexOf()的签名改为Object类型而不是T类型。但是,这样我就失去了类型检查。此外,如果“data”也被声明为BetaData类型,我希望第B行也能工作。有没有办法做我想做的事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
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>lainAlphaData
,或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的子类。