我有一个抽象方法作为抽象类的一部分,具有以下声明:
abstract public ArrayList<Device> returnDevices(ArrayList<Object> scanResult);
我希望传递的参数是一个ArrayList,但ArrayList中的type对象将依赖于继承此超类的子类并实现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>)
很明显它拒绝参数类型。实现我想做的事情的正确方法是什么?
答案 0 :(得分:9)
- 这是Collections
在Java中 type-safed 的方式,因此错误的类型不会进入集合,由于在`Compilation
时间内仅检查,在Runtime
期间不,因此Cat对象不应进入收藏类型狗。
你可以这样做......
public ArrayList<Device> returnDevices(ArrayList<? extends Object> scanResult)
或强>
public <T extends Object> ArrayList<Device> returnDevices(ArrayList<T> scanResult)
答案 1 :(得分:1)
问题是,即使Packet
是Object
,ArrayList<Packet>
也不是ArrayList<Object>
。 通用类型在Java中是不变的。
您可以将extends
和super
关键字与您的类型参数一起使用,以在Java泛型中引入该类型的效果。
我认为以下是它应该是什么
abstract public <T extends Device> List<T> returnDevices(List<T> scanResult);
使用该方法,可以获取Device
的列表并返回Device
的alist,也可以获取Device
的某个子类型的列表,并返回相同子类型的列表
旁注:对某些具体类型(例如ArrayList
)进行编码不是一个好习惯。您应该尽可能对接口进行编码(例如List
)。