【问题标题】:how can I call the java method instead of the new member functions if they have the same name如果它们具有相同的名称,我如何调用 java 方法而不是新的成员函数
【发布时间】:2013-06-25 21:32:05
【问题描述】:

遗憾的是,它不仅仅是超载...

我正在尝试将我的应用程序从 railo 3.3 升级到 4.1

我经常使用底层的 java 方法,而且大多数时候这不是问题。我有一个使用 java Comparator 对象排序的数组:

a.sort(
    createObject(
        "java", 
        "AlphanumComparator", 
        "/model/java/AlphanumComparator.jar"
    )
);

在 3.3 上运行良好。但是随着 4.0 中的新成员函数,添加了一个新的 array.sort 方法,其运行方式与 arraySort() 相同。

现在我收到以下错误:

invalid sort type [AlphanumComparator@someid], sort types are [text, textNoCase, numeric]

转储getClass() 表明原来的 java 方法仍然存在,但我似乎无法调用它...

【问题讨论】:

  • 尝试使用a.toArray() 获取Java 数组,然后调用.sort(Comparator)
  • 根本找不到排序方法No matching Method/Function for [Ljava.lang.Object;.sort(AlphanumComparator) found
  • 哦,抱歉,我以为这是您所追求的内部 Java 方法,但事实并非如此。解决此问题的最佳方法可能是在Railo mailing list 上提问。
  • 顺便说一句,我将 getClass() 转储到 CFML 数组上,签名似乎是 void sort(java.lang.String, java.lang.String),这是 arraySort() 的成员版本,而不是您以前能够使用的 Comparator 版本调用Railo 3.3。请参阅下面的答案以获取解决方案。

标签: java coldfusion overloading railo


【解决方案1】:

我相信您在 3.3 中调用的 .sort() 方法“仅仅是”Railo 的 railo.runtime.type.ArrayImpl 类的实现细节,而不是通用(标准)Java 类。因此,这会让您面临实施可能会发生变化的风险——而且确实发生了变化。

一个小的代码更改将允许您使用java.util.Collections 和静态sort() 方法:

var Collections = createObject( "java", "java.util.Collections" );
Collections.sort( a, createObject( "java",
                                   "AlphanumComparator",
                                   "/model/java/AlphanumComparator.jar" ) );

我使用 CFML 字符串数组和默认的 java.text.Collator 在 Railo 4.0.4.001 上对此进行了测试,因此我相信它也适用于您的 java.util.Comparator 实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多