2009-07-15 3 views
0
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. Наверное, мне пришлось бы обмануть их, но не знаю, как это сделать?литые элементы ArrayList?

+0

Какой тип "obj"? –

+0

Является ли ваш ArrayList использованием дженериков? Каковы типы, хранящиеся в списке, это Integer? – quosoo

+0

Тип obj - это еще один пакет «GSE_packet» .. – Kam

ответ

1

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


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

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

+0

Как я могу сделать, если у меня есть другие типы, такие как boolean и long? – Kam

+0

Тот же шаблон применяется, ((Boolean) obj.get (b)). BooleanValue(), ((Long) obj.get (l)). LongValue() и т. Д. –

1

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

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

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

0

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

(int)obj.XYZ.get(t) 

с

((Integer)obj.XYZ.get(t)).intValue() 
+0

как я могу сбрасывать, если у меня есть другие типы boolean и long ...? – Kam

+0

Хорошо - с Long вы делаете точно то же самое ((Long) obj.XYZ.get (t)). IntValue() или ((Long) obj.XYZ.get (t)). LongValue() в зависимости от того, какой тип вы хотите конвертировать. Boolean хотя и не имеет метода преобразования int, поэтому вы можете попробовать ((Boolean) obj.XYZ.get (t)). BooleanValue()? 1: 0 – quosoo

0

В то время как вы можете отлиты с использованием метода, описанного Крис Дж, что может быть шаг сайдинг реальную проблему.

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

Прямо сейчас у ваших аксессуаров есть obj.ack.get (t), который, если я правильно его читаю, плохо объективно-ориентированный дизайн. Кажется, у вас есть object.field.get (t). Вы должны иметь, объект.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

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

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

1

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

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

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

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 

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

+0

Спасибо за все ответы выше! – Kam

+0

Дополнительным условием является то, что Java 5 или 6 используется, но это почти всегда так. – quosoo

+0

Да, даже давно работающее веб-приложение, где я работаю, было обновлено до Java 5. – Powerlord

Смежные вопросы