我有一个定义相关类型的特征。在函数中,我想返回这个根据提供的值而不同的关联类型:
sealed trait Abstract {
type T
}
class Impl1 extends Abstract {
type T = Int
}
class Impl2 extends Abstract {
type T = Boolean
}
object G {
def get[A <: Abstract] (x: A): A#T = {
x match {
case i1: Impl1 =>
5
case i2: Impl2 =>
true
}
}
}
问题是,scala无法识别匹配的情况A#T
分别是Int
或Boolean
,我收到以下错误消息:
Expression of type Int doesn't conform to expected type A#T
我该如何解决这个问题?
答案 0 :(得分:2)
您的 $messages = array();
foreach ($errors as $element) {
foreach ($element as $element_error) {
$messages[] = $element_error;
}
}
$response['messages'] = $messages;
$response['status'] = 'error';
return new JsonResponse($response, 200);
条件会给出AnyVal结果,但它对use Illuminate\Http\JsonResponse;
一无所知。您应该对结果或extrac模式匹配使用match
A#T
答案 1 :(得分:1)
问题是,scala没有认识到在匹配的情况下A#T分别是Int或布尔值
严格地说,它不是。例如,您可以致电
get[Abstract](new Impl1)
在这种情况下,A#T
为Abstract#T
,Int
不是Boolean
。或
get(throw new Exception)
所以你得到Nothing#T
(Nothing <: Abstract
,毕竟!)。
一般来说,根据我的经验,即使在GADT上,Scala也不是那么好,而且你经常需要做的事情是帮助&#34;通过使用演员阵容,你有责任确保他们的安全。