将返回的ArrayLlist转换为与“Object ... name”形成一致的List

时间:2016-02-11 14:13:57

标签: java arraylist

Hellow

我创建了一个类Packet,如下所示

public class Packet 
{
    private long arrivalTime = 0;
    private boolean classType = true;

    public Packet(long arrivalTime, boolean classType)
    {
        this.arrivalTime = arrivalTime;
        this.classType = classType;
    }

在程序中我有两种方法;

public ArrayList<Packet> simulateArrProces (long loopCount)
{
//DO STUFF
}

public void enqueue(Packet...packets)
{
//DO STUFF
}

目标是使用simulateArrProces方法返回的ArrayList作为enqueue方法的输入。我以为我可以简单地给出第一个方法的ArrayList,但这似乎不起作用。我尝试了以下

Arrival arr = new Arrival(arrivalProces);
Queue que = new QueueFCFS();
List l = arr.simulateArrProces(0);
que.enqueue(l.toArray());

很明显,我应该将返回的simulateArrProces的ArrayList转换为某些东西,但是我找不到。我认为这是因为我选择使用'Packet ... packet',但我并没有完全理解这个表达的含义。

总之;两个问题 1.如何将simulateArrProces返回的ArrayList转换为我可以在enqueue方法中使用的东西。 2. Packet ...数据包的确切含义

2 个答案:

答案 0 :(得分:3)

toArray的{​​{1}}方法(Collection以及随后的List继承)以overload为特征,采用(空)数组ArrayList(您的参数化类型)作为参数:这是您应该使用的,以便不返回T

反过来,这可以传递给一个采用该类型的varargs作为参数的方法。

示例

...鉴于

Object[]

以下是您可以使用的“好”与“坏”习语:

List<String> foo() {
    // just as example
    return new ArrayList<String>();
}
void bar(String... s) {
    // nope
}

答案 1 :(得分:1)

让我们从数据包...数据包开始。 它的var-args特性是java。这意味着您可以传递任意数量的数据包对象。它会隐式转换为Packet数组,因此您也可以传递数组

示例1:

class Packet {
  // your implementation goes here
}

class SomeClassWithVarArgs{
   void foo(Packet ... packet);
}


// So you can do the following:


Packet p1 = new Packet();
Packet p2 = new Packet();
Packet p3 = new Packet();

SomeClassWithVarArgs s = new SomeClassWithVarArgs();

// all these are legal
s.foo(p1, p2,p3);
s.foo(p1, p2);
s.foo(p3, p3,p3,p3,p3);

// implicit conversion to array:
Packet [] arrayOfPackets = new Packet[] {p1, p2,p3};
s.foo(arrayOfPackets);

现在关于toArray。 它只是一个你必须学习的编译相关问题。

显然,你不能将ArrayList和List都传递给enqueue(Packet... packets)。所以你已经尝试将列表转换为数组,这是一个很好的尝试。 但是toArray会返回Object [],显然它不是您想要的。

所以你应该使用以下方法:

示例2:

List<Packet> li = ...
Packet [] arr = li.toArray(new Packet[li.size()]);

 // now you can pass it to enqueue method
enqueue(arr);

希望这有帮助