使用Ceylon在Named Constructor中指定Generic Type

时间:2016-04-01 14:02:57

标签: generics ceylon

我在锡兰有以下代码:

shared class Try<out Result> given Result satisfies Anything {

    late Result|Exception computationResult;

    shared new (Result() computation) {
        try {
            this.computationResult = computation();
        } catch (Exception e) {
            this.computationResult = e;
        }
    }

    new fromResult(Result|Exception computationResult) {
        this.computationResult = computationResult;
    }

    shared Result|Exception result() => this.computationResult;

    shared Try<MappingResult> map<MappingResult>(MappingResult(Result) mappingFunction) {
        if (is Result computationResult) {
            try {
                MappingResult mappingResult = mappingFunction(computationResult);

                return Try.fromResult(mappingResult);
            } catch (Exception e) {
                return Try.fromResult(e);
            }
        } else {
            return Try.fromResult(computationResult);
        }
    }
}

现在,当我尝试使用构造函数fromResult时使用Exception实例,如下所示:

} catch (Exception e) {
    return Try.fromResult(e);
}

我收到以下错误:

  

返回的表达式必须可以赋值给map的返回类型:   Try<Exception>.fromResult无法分配Try<MappingResult>

1 个答案:

答案 0 :(得分:3)

您可以使用<MappingResult>明确提供类型参数,如:

shared Try<MappingResult> map<MappingResult>(MappingResult(Result) mappingFunction) {
    if (is Result computationResult) {
        try {
            MappingResult mappingResult = mappingFunction(computationResult);

            return Try<MappingResult>.fromResult(mappingResult);
        } catch (Exception e) {
            return Try<MappingResult>.fromResult(e);
        }
    } else {
        return Try<MappingResult>.fromResult(computationResult);
    }
}

请注意,有一个未解决的问题可以改进您收到的错误消息 - https://github.com/ceylon/ceylon/issues/6121