Как проверить тип данных java элемента в пользовательской коллекции?

Object ele=a.get(i);
if(ele instanceof java.lang.Integer){//cast to integer:
    print("found Int");
}else{ //cast to string:
    print("found: "+ele.getClass());
}
//prints: found: class com.cycling74.max.Atom$IntAtom

Это часть большого куска кода, но это важная часть. Мне нужно знать, как проверить тип элемента в классе Atom с помощью езда на велосипеде74.

if(ele instanceof com.cycling74.max.Atom$IntAtom)
//ERROR: com.cycling74.max.Atom.IntAtom has private access in com.cycling74.max.Atom

Любые идеи?? Большое спасибо - это действительно делает мою голову!!


person cronoklee    schedule 30.03.2011    source источник
comment
Если класс объявлен private, вы не можете выполнять instanceof вне класса com.cycling74.max.Atom.   -  person Buhake Sindi    schedule 30.03.2011


Ответы (3)


Да, это возможно, не делая IntAtom общедоступным, хотя это немного хакерски.

Сначала вам нужно получить ссылку на закрытый внутренний класс IntAtom:

public class SomeClass {
  public static final Class<?> INT_ATOM_CLASS;
  static {
    Class<?> [] innerClasses = Atom.class.getDeclaredClasses();
    Class<?> intAtomClass = null;
    for (Class<?> klass : innerClasses) {
      if (klass.getSimpleName().equals("IntAtom")) {
        intAtomClass = klass;
        break;
      }
    }
    INT_ATOM_CLASS = intAtomClass;
  }
}

Затем, чтобы выполнить проверку instanceof:

if (SomeClass.INT_ATOM_CLASS.isAssignableFrom(ele.getClass())) {
   // do stuff
}

Javadoc для Class.isAssignableFrom(Class c);

person Matt Crinklaw-Vogt    schedule 30.03.2011

Я думаю, вам придется либо сделать IntAtom общедоступным, либо предоставить общедоступную функцию в Atom, которая может проверить, является ли объект IntAtom или нет. Прямо сейчас определение класса нельзя сравнивать, потому что оно закрыто для Atom.

person roberttdev    schedule 30.03.2011
comment
Хм, спасибо @roberttdev Звучит сложно. У меня нет доступа к классу Atom. Это API, встроенный в программное обеспечение MaxMSP. Кроме того, если бы у меня был доступ, я бы не знал, с чего начать, поскольку я новичок в java! (это мой первый проект!). Есть ли какой-нибудь хакерский обходной путь, который я мог бы попробовать ?? - person cronoklee; 30.03.2011
comment
Единственное, что я могу придумать, это создать подкласс Atom и внести изменения самостоятельно. Это некрасиво.. но я не знаю, как еще вы можете получить доступ к этому частному классу. Дважды проверьте API, чтобы убедиться, что они не предлагают что-то для этого в первую очередь. - person roberttdev; 30.03.2011
comment
ваше решение для создания подклассов не поможет, поскольку частные классы не наследуются подклассами. - person Buhake Sindi; 30.03.2011
comment
возможно сделать это, не делая IntAtom общедоступным, хотя и не всегда желательно. Смотрите мой ответ ниже. - person Matt Crinklaw-Vogt; 30.03.2011

Большое спасибо, ребята - кажется, в классе Atom есть метод, который называется isInt(), который может проверять встроенный тип данных. Я бы не искал его, если бы вы, ребята, не вернулись, поэтому я очень ценю помощь!

person cronoklee    schedule 30.03.2011
comment
Это должен был быть комментарий, т. е. не размещайте комментарии в разделах ответов. - person Buhake Sindi; 30.03.2011