литье элементов ArrayList? - PullRequest
       13

литье элементов ArrayList?

0 голосов
/ 15 июля 2009
TCPPacket TCPobj = new TCPPacket((int)obj.src_port.get(t),(int)obj.dst_port.get(t),
                                       obj.sequence.get(t),obj.ack_num.get(t),obj.urg.get(t),
                                       obj.ack.get(t),obj.psh.get(t), obj.rst.get(t),obj.syn.get(t),
                                       obj.fin.get(t),obj.rsv1.get(t),obj.rsv2.get(t),
                                       obj.window.get(t),obj.urgent_pointer.get(t));

src_port, dst_port, sequence ... и т. Д. - мой ArrayList, но мой конструктор требует типа int. Полагаю, мне придется их обойти, но не знаю как?

Ответы [ 6 ]

1 голос
/ 15 июля 2009

Если вы управляете классом, экземпляром которого является obj, я настоятельно рекомендую изменить эти списки ArrayLists на общие.

Обобщения работают путем добавления приведений к байт-коду для вас, так же, как это делает автобокс. Пара из них весьма полезна вместе.

Например, если у меня есть это:

public List<integer> numbers = new ArrayList<Integer>();

Тогда я тоже могу сделать это:

numbers.add(80); // Boxing

int source_port = numbers.get(0); // Casting, Unboxing

и это за кадром превращается в эквивалент этого:

numbers.add(Integer.valueOf(80)); // Boxing

int source_port = ((Integer) numbers.get(0)).intValue(); // Casting, Unboxing

Это действительно надумано, но экономит много ручного труда.

1 голос
/ 15 июля 2009

Вы не можете привести к int, вам нужно использовать Integer, а затем, если вам нужно получить int, вызвать .intValue (). то есть:

int thisInt = ((Integer) obj.src_port.get(t)).intValue();

Все примитивы Java (логические, длинные и т. Д.) Имеют полные эквиваленты объектов (логические, длинные и т. Д.), К которым можно привести данные. Каждый из этих объектов имеет метод доступа к примитиву (booleanValue (), longValue () и т. Д.), Который даст вам примитивный эквивалент.

1 голос
/ 15 июля 2009

Без дополнительного контекста трудно сказать, но если obj.src_port - это ArrayList, содержащий Integer объектов, вы можете сказать:

<code>
    TCPPacket TCPobj = new TCPPacket(((Integer)obj.src_port.get(t)).intValue(),
                                     ...
                                    );
);
<code>

т.е. сначала вам нужно привести к Integer , а затем распаковать в int . В Java 5 и более поздних версиях распаковка будет выполнена за вас.

0 голосов
/ 15 июля 2009

Используйте toArray и отражение.

(Отражение - это действительно плохая идея, кстати, но я просто хотел это сказать.)

0 голосов
/ 15 июля 2009

Несмотря на то, что вы можете использовать метод, описанный Крисом Дж, это может быть серьезной проблемой.

Если у вас есть контроль над классом obj, GSE_packet, вы хотите, чтобы ваши аксессоры (получатели) предоставили тип.

Сейчас ваши методы доступа: obj.ack.get (t) , что, если я правильно читаю, плохой объектно-ориентированный дизайн Похоже, у вас есть object.field.get (t) . Вы должны иметь, object.getack (t) .

Таким образом, в GSE_packet измените

//this is a bad class name
// GsePacket or GSEPacket would be more in tune with java standards
class GSE_packet {
    public ack;
}

до

class GsePacket {
    private ack;

    public int getAck(what you are passing here) {
        return ack;
    }
}
0 голосов
/ 15 июля 2009

Вам нужно заменить каждый

(int)obj.XYZ.get(t)

с

((Integer)obj.XYZ.get(t)).intValue()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...