Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
'Coder[P<;:Product]`的Scala 2宏类型类派生以错误'P不接受参数'结束`_Scala_Typeclass_Scala Macros_Scala 2.13_Defmacro - Fatal编程技术网

'Coder[P<;:Product]`的Scala 2宏类型类派生以错误'P不接受参数'结束`

'Coder[P<;:Product]`的Scala 2宏类型类派生以错误'P不接受参数'结束`,scala,typeclass,scala-macros,scala-2.13,defmacro,Scala,Typeclass,Scala Macros,Scala 2.13,Defmacro,我是Scala 2宏的初学者(在我切换到Dotty之前),在尝试了无形状类型类派生之后,我想更进一步,编写一个可以为任何Scala.Product生成类型类实例的宏 (为了示例起见,让我们忽略嵌套的递归类型,所以我的目标是平面案例类。) My type类是一个抽象类(例如trait withencode()/decode()) 因此,生成的代码用于: 案例类Pojo( s:弦, i:Int, l:列表[Int] ) 应该是这样的: import com.github.fpopic.scalam

我是Scala 2宏的初学者(在我切换到Dotty之前),在尝试了无形状类型类派生之后,我想更进一步,编写一个可以为任何
Scala.Product
生成类型类实例的宏

(为了示例起见,让我们忽略嵌套的递归类型,所以我的目标是平面案例类。)

My type类是一个抽象类(例如trait with
encode()
/
decode()

因此,生成的代码用于:

案例类Pojo(
s:弦,
i:Int,
l:列表[Int]
)
应该是这样的:

import com.github.fpopic.scalamacros.Pojo
导入org.apache.beam.sdk.coders.Coder
导入java.io.{ByteArrayInputStream,ByteArrayOutputStream}
导入java.util
类PojoCoder扩展了编码器[Pojo]{
导入com.github.fpopic.scalamacros.beam.defmocoder{
stringCoder,
国际编码公司,
列表编码器
}
覆盖def编码(值:Pojo,os:OutputStream):单位={
stringCoder.encode(value.s,os)
intCoder.encode(value.i,os)
listCoder(intCoder).encode(value.l,os)
}
覆盖def解码(is:InputStream):Pojo={
波乔(
s=字符串编码器。解码(is),
i=内部编码器解码(is),
l=列表编码器(intCoder).解码(is)
)
}
覆盖def getCoderArguments:util.List[\u
val fieldTerm=field.asTerm.name//e.g.value.s(目前仅为s)
val fieldType=field.typeSignature.finalResultType//例如字符串
val fieldCoderName=c.freshName(TermName(“coder”)//例如,给出友好的名称coder$。。。
val fieldCoderInstance=//例如,查找编码器的实例[String]
c、 打字检查(
tree=q“”“\u root\u.scala.Predef.隐式[org.apache.beam.sdk.coders.Coder[${fieldType}]]”,
沉默=错误
)
val fieldCoderExpression=
q“private val${fieldCoderName}:org.apache.beam.sdk.coders.Coder[${fieldType}]=${fieldCoderInstance}”
val字段编码表达式=
q“${fieldCoderName}.encode(value.${fieldTerm},os)”//替换为完整的相对名称(带点),而不是值
val字段解码表达式=
q“${field.asTerm}=${fieldCoderName}.decode(is)”
(fieldCoderExpression、fieldEncodeExpression、fieldDecodeExpression)
}
val fieldCodersExpression=expressions.map(u._1).distinct
val coderEncodeExpresions=expressions.map(u._2)
val coderDecodeExpresions=expressions.map(u.3)
val共表达=
q”“”{
新org.apache.beam.sdk.coders.Coder[${tpe}]{
{import${c.prefix}.}
..${FieldCoderExpression}
重写def encode(值:${tpe},os:java.io.OutputStream):\u root\u.scala.Unit={
..${coderencodeexpressions}
}
重写def解码(is:java.io.InputStream):${tpe}={
${tpe.typeConstructor}(
..${CODERDECODEXPRESSIONS}
)
}

重写def getCoderArguments:java.util.List[\p>实例化类的方式是错误的:

${tpe.typeConstructor}(...)
应该是

new $tpe(...)
或者,如果要使用case类同伴对象的
应用
而不是普通构造函数执行此操作:

${tpe.typeSymbol.companion}(...)

注意:类型构造函数(也称为高级类型)与类构造函数无关

非常感谢!我计划使用
typeConstructor
创建
Coder[F]
类型,然后开始隐式搜索它,但随后完全混合了这两种类型并将其放错位置。
${tpe.typeSymbol.companion}(...)