我尝试使用处理JavaScriptObjects的列表重载List
public class JsList<T extends JavaScriptObject> extends JavaScriptObject implements List<T>
{ etc...}
在编译为javascript时工作正常但在托管模式和Designer中都失败。问题源于
CompilingClassLoader::findOverloadUsingErasure(JClassType implementingType, JMethod intfMethod)
当函数试图找到重载函数时,它失败了,因为JsList的类型T通过擦除等同于JavaScriptObject而类型T的List等于Object。有关修复此问题的任何建议吗?
答案 0 :(得分:0)
鉴于一个接口最多可以由一个JSO实现,那么如何删除类型变量的边界呢?
替代方法是将JSO包装到实现List的对象中,而不是让JSO实现接口本身。
作为旁注,请记住Java List
比JS数组有更多约束。例如,您可以在JS中执行:
var arr = [];
// arr.length is 0
arr[3] = "foo";
// arr.length is now 4
arr.length = 2;
// arr.length is now 2
// arr[3] can be retrieved but is 'undefined'
你不能用Java做的事情:
List<String> list = new ArrayList<String>();
// list.size() is 0
list.put(3, "foo"); // ← throws an IndexOutOfBoundsException
// list.get(3) would throw too