Eclipse RCP 属性 测试人员的预期值是否始终为字符串?

Are expected values for Eclipse RCP property testers always String?

在 eclipse 文档中,我看到了以下代码片段 (http://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fcore%2Fexpressions%2FPropertyTester.html):

<propertyTester
   namespace="org.eclipse.jdt.core"
   id="org.eclipse.jdt.core.IPackageFragmentTester"
   properties="isDefaultPackage"
   type="org.eclipse.jdt.core.IPackageFragment"
   class="org.eclipse.demo.MyPackageFragmentTester">
 </propertyTester>

使用以下 属性 测试器实现:

public class MyPackageFragmentTester extends PropertyTester {
    public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
        IPackageFragment fragment= (IPackageFragment)receiver;
              if ("isDefaultPackage".equals(property)) {
            return expectedValue == null
             ? fragment.isDefaultPackage()
             : fragment.isDefaultPackage() == ((Boolean)expectedValue).booleanValue();
        }
        Assert.isTrue(false);
        return false;
    }
}

我有点想知道 ((Boolean)expectedValue) 部分 - 因为期望值在 <test property="..."/> 标记中作为字符串给出:

<test property="org.eclipse.jdt.core.isDefaultPackage" value="true" />

每当我实现一个 属性 测试器时,值都是以字符串的形式给出的。

所以我的问题是:是否可能有一个不是字符串的期望值?根据 Eclipse RCP 文档,它应该是...但是如何!?

不是很清楚,但预期值可以是 StringBooleanFloat (!) 或 Integer.

计算出的代码在org.eclipse.core.internal.expressions.Expressions:

public static Object convertArgument(String arg) throws CoreException {
    if (arg == null) {
        return null;
    } else if (arg.length() == 0) {
        return arg;
    } else if (arg.charAt(0) == '\'' && arg.charAt(arg.length() - 1) == '\'') {
        return unEscapeString(arg.substring(1, arg.length() - 1));
    } else if ("true".equals(arg)) { //$NON-NLS-1$
        return Boolean.TRUE;
    } else if ("false".equals(arg)) { //$NON-NLS-1$
        return Boolean.FALSE;
    } else if (arg.indexOf('.') != -1) {
        try {
            return Float.valueOf(arg);
        } catch (NumberFormatException e) {
            return arg;
        }
    } else {
        try {
            return Integer.valueOf(arg);
        } catch (NumberFormatException e) {
            return arg;
        }
    }
}

所以它是 String 除非它是 truefalse 或数字。