我正在尝试使用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中的错误还是我在这里做错了什么?
答案 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再次运行。
所以我总结说这是特定(旧)版本中的一个错误。