繁体   English   中英

如何使方法参数类型为ArrayList <Object> 采取不同的对象类型

[英]how to make method parameter type ArrayList<Object> take different object types

我有一个抽象方法作为抽象类的一部分,具有以下声明:

abstract public ArrayList<Device> returnDevices(ArrayList<Object> scanResult);

我希望传递的参数是一个ArrayList,但ArrayList中的类型对象将依赖于继承此超类并实现方法returnDevices的子类。

我认为我可以通过如上所述使方法抽象来实现这一点,然后在继承它的子类中执行以下操作:

public ArrayList<Device> returnDevices(ArrayList<Object> scanResult) {

    Iterator<Object> results = scanResult.iterator();
    while(results.hasNext())
        Packet pkt = (Packet) results.next();  // HERE: I cast the Object
}

这很好,不会导致错误,但是当我尝试使用ArrayList<Packet>类型的参数调用returnDevices时,如下所示:

ArrayList<Packet> packets = new ArrayList<Packet>();
// <----- the "packets" ArrayList is filled here
ArrayList<Device> devices = returnDevices(packets);

......我收到错误:

The method returnDevices(ArrayList<Object>) in the type ScanResultParser is not applicable for the arguments (ArrayList<Packet>)

很明显它拒绝参数类型。 实现我想做的事情的正确方法是什么?

-这就是如何在Java中对Collections进行类型安全处理 ,因此错误的类型不会进入集合 ,因为集合`Compilation时”和“ Runtime期间进行检查,即Cat对象不应进入类型狗的集合。

你可以这样做......

public ArrayList<Device> returnDevices(ArrayList<? extends Object> scanResult)

要么

public <T extends Object> ArrayList<Device> returnDevices(ArrayList<T> scanResult)

问题是,即使Packet是一个ObjectArrayList<Packet>也不是ArrayList<Object> 通用类型在Java中是不变的

您可以将extendssuper关键字与您的类型参数一起使用,以在Java泛型中引入该类型的效果。

我认为以下是应该的

abstract public <T extends Device> List<T> returnDevices(List<T> scanResult);

随着与任一方法采取的列表Device S和返回ALIST Device S或采取的一些亚型的列表Device并返回相同亚型的列表。


旁注:针对某些具体类型(例如ArrayList )进行编码不是一个好习惯。 您应该尽可能对接口进行编码(例如List )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM