J2ObjC JavaLangTreeSet<String> не возможно?

Я пытаюсь создать TreeSet в objc, используя пакет cocoapod J2ObjC v0.9.6.1 (последний на данный момент).

#include <java/util/TreeSet.h>

    id<JavaUtilSet> set = [[JavaUtilTreeSet alloc] init];
    for (NSString* setval in (NSArray*)values) {
        [set addWithId:setval];  // <== JavaLangClassCastException
    }

Однако это вызывает исключение:

JavaLangClassCastException: java.lang.String is not Comparable

указывая на то, что NSString (нет отдельного JavaLangString в j2objc) не приведут к Comparable объект. Исключение выбрасывается из

JavaUtilTreeMap findWithId:withJavaUtilTreeMap_RelationEnum:

Предыдущая версия 0.9 (8ee9dc12ad) прекрасно работала с моим кодом выше. Если я изменю JavaUtilTreeSet быть JavaUtilHashSet тогда это работает.

Это ошибка в v0.9.6.1 J2ObjC или я что-то здесь не так делаю?

3 ответа

Я думаю, что вам нужно включить NSString + JavaString.h (это публичный заголовок j2objc), так как это определяет категорию NSString, которая добавляет сопоставимый протокол. В противном случае эти объекты NSString являются просто NSStrings.:-)

Оказывается, версия в Cocoapods устарела примерно на 2 года, если не больше. Последняя версия J2ObjC - v2.0.2, и после перехода на эту (не-pod) версию TreeSet снова работает.

Итак, я заключаю, что это ошибка в этой конкретной (старой) версии.

TreeSet работает, как показано в этом примере:

import java.util.*;

class TreeSetTest {
  public static void main(String... args) {
    Set<String> set = new TreeSet<>();
    for (String setval : args) {
      set.add(setval);
    }
    System.out.println(set);
  }
}

$ j2objc TreeSetTest.java
$ j2objcc TreeSetTest.m
$ ./a.out TreeSetTest Tom Dick Harry
[Dick, Harry, Tom]

Многие заголовки были включены в TreeSetTest.h и TreeSetTest.m, поэтому я рекомендую вам перевести этот пример и посмотреть, что сгенерировано. "Java/io/PrintStream.h" и "java/lang/System.h" не нужны для вашего кода, поскольку он поддерживает строку System.out, но включение других не повредит и может решить вашу проблему,

Другие вопросы по тегам