我正在使用J2ObjC cocoapod包v0.9.6.1 (当前的最新版本)在objc中创建一个。
#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版本0.9.6.1中的一个bug,还是我在这里做错了什么?
发布于 2017-07-21 04:43:26
我认为您需要包括NSString+JavaString.h (它是一个j2objc公共头),因为它定义了添加可比较协议的NSString类别。否则,这些NSString对象就是NSStrings。:-)
发布于 2017-07-23 01:18:34
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行,但是包含其他代码不会对您造成伤害,并且可能会解决您的问题。
发布于 2017-07-23 17:11:19
事实证明,Cocoapods的版本已经过时了2年,如果不是更多的话。最新的J2ObjC是v2.0.2,在切换到那个(非pod)版本之后,TreeSet再次工作。
所以我得出结论,这是那个特定(旧的)版本中的一个bug。
https://stackoverflow.com/questions/45228563
复制相似问题