J2ObjC JavaLangTreeSet <string>不可能?

时间:2017-07-21 03:40:17

标签: j2objc

我正在尝试使用J2ObjC cocoapod包 v0.9.6.1 (目前最新的)在objc中创建一个TreeSet。

#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(j2objc中没有单独的JavaLangString)不会转换为Comparable对象。

引发了异常
JavaUtilTreeMap findWithId:withJavaUtilTreeMap_RelationEnum:

之前的0.9版本(8ee9dc12ad)与上面的代码一起工作得很好。如果我将JavaUtilTreeSet更改为JavaUtilHashSet,那就可以了。

这是J2ObjC的v0.9.6.1中的错误还是我在这里做错了什么?

3 个答案:

答案 0 :(得分:0)

我认为您需要包含NSString+JavaString.h(它是一个j2objc公共标头),因为它定义了添加Comparable协议的NSString类别。否则那些NSString对象只是NSStrings。 : - )

答案 1 :(得分:0)

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行,但包括其他行不会受到影响并可能解决您的问题

答案 2 :(得分:0)

事实证明,Cocoapods中的版本已经过时约2年,如果不是更多的话。最新的J2ObjC是v2.0.2,在切换到那个(非pod)版本之后,TreeSet再次运行。

所以我总结说这是特定(旧)版本中的一个错误。