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, но включение других не повредит и может решить вашу проблему,