3

我正在尝试使用 switch 子句根据“any”类型的变量的实际类型来定义要做什么,我的代码正在崩溃。代码如下:

handleResponse(any.parseType("string",respValuesRaw[type]), currEPIFace);
...
...
...
action handleResponse(any response, CurrentExtraParamsInteface currEPIFace){

switch(response){
    case string:
        {}

我得到的错误是:“ParseException - ParseType() 方法中的错误:无法解析字符串:缺少开头引号”

但是,该respValuesRaw变量是类型的字典<string,string>

这是在 Apama 10.1 上。

知道可能出了什么问题吗?

4

3 回答 3

3

根据any.parseType的文档,这等效于调用 type.parse,因此这等效于string.parse,其中指出:

parse 方法采用用于事件文件的形式的字符串。字符串参数必须用双引号括起来。所有转义字符都将转换为自然字符。

如果您只想使用字典条目的值,您可能只想写:

handleResponse(respValuesRaw[type], currEPIFace);

字典条目的值是一个字符串,将任何类型传递给“任何”参数都是合法的。

于 2019-03-14T11:48:04.980 回答
1

将像 string 这样的基本类型分配给anytype 是绝对合法的。问题出在其他地方。

由于您没有以用于事件文件的形式传递字符串,因此会出错。一旦您查看parseType使用方法的一个示例,解码错误消息就变得非常简单。这给出了一些提示,为什么它真的在论点中寻找开场白。


你的问题简单地说:

package com.apama.test;

event Evt{}
monitor Foo {
    action onload() {
        Evt e1;
        // handleResponse(any.parseType("string", "World!")); // #1 Invalid argument. Doesn't work
        handleResponse(any.parseType("com.apama.test.Evt", "com.apama.test.Evt()")); // #2
        handleResponse("World!"); // #3
    }
    action handleResponse(any response){
        log "Hello " + response.toString() ;
    }
}

印刷:

com.apama.test.Foo [1] Hello any(com.apama.test.Evt,com.apama.test.Evt())
com.apama.test.Foo [1] Hello any(string,"World!")

虽然取消注释#1会给出如下所示的错误:

ParseException - Error in parseType() method: Unable to parse string: missing opening quote 

此外,如果您将格式正确但不存在的事件传递给parseType方法,它将引发错误,指出找不到类型。

ParseException - Error in parseType() method: Unable to find type 'com.apama.test.Evt2' 
于 2019-03-15T04:39:43.693 回答
0

我发现这种解析不适用于基本类型,所以我改变了调用 handleResponse 动作的方式:

handleResponse("string", currEPIFace);

实际上,任何字符串值都适合。

于 2019-03-14T11:39:05.213 回答