Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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
Scala ficus配置加载通用_Scala_Class Hierarchy_Classtag - Fatal编程技术网

Scala ficus配置加载通用

Scala ficus配置加载通用,scala,class-hierarchy,classtag,Scala,Class Hierarchy,Classtag,加载ficus配置,如 loadConfiguration[T <: Product](): T = { import net.ceedubs.ficus.readers.ArbitraryTypeReader._ import net.ceedubs.ficus.Ficus._ val config: Config = ConfigFactory.load() config.as[T] 当直接指定案例类而不是T时,即SomeClass工作正常。这里缺少什么?Ficus使用,它允许您通过

加载ficus配置,如

loadConfiguration[T <: Product](): T = {
import net.ceedubs.ficus.readers.ArbitraryTypeReader._
import net.ceedubs.ficus.Ficus._
val config: Config = ConfigFactory.load()
config.as[T]
当直接指定案例类而不是
T
时,即
SomeClass
工作正常。这里缺少什么?

Ficus使用,它允许您通过指定必须对泛型类型可用的操作来约束泛型类型。Ficus还提供类型类实例“派生”,在本例中,该派生由一个宏提供,该宏可以检查特定类型类(如类型)的结构,并自动创建类型类实例

本例中的问题是,
T
不是一个特定的case类,它是扩展
产品
的任何旧类型,可能是这样的:

case class EasyToDecode(a: String, b: String, c: String)
但也可能是:

trait X extends Product {
  val youWillNeverDecodeMe: String
}
您从
ArbitraryTypeReader
导入的宏目前还不清楚,因为
T
在这里是通用的。所以你需要一种不同的方法

这里的相关类型类是
ValueReader
,您可以将代码最少更改为以下内容,以确保
T
具有
ValueReader
实例(注意这里的
T:ValueReader
语法就是所谓的“上下文绑定”):

这指定了
T
必须有一个
ValueReader
实例(它允许我们将
.as[T]
),但没有说明
T
,也没有说明它的
ValueReader
实例需要来自何处

使用具体类型
MyType
调用此方法的人有几个选项。Ficus为许多标准库类型提供了在任何地方都可以自动使用的实例,因此如果
MyType
是例如
Int
,则它们都被设置为:

scala> ValueReader[Int]
res0: net.ceedubs.ficus.readers.ValueReader[Int] = net.ceedubs.ficus.readers.AnyValReaders$$anon$2@6fb00268
如果
MyType
是自定义类型,那么他们可以手动定义自己的
ValueReader[MyType]
实例,或者导入其他人定义的实例,或者使用泛型派生(这就是
arbirytypereader
所做的)


这里的关键点是,类型类模式允许您作为泛型方法的作者指定所需的操作,而无需说明如何为具体类型定义这些操作。您只需编写
T:ValueReader
,调用者根据需要导入
ArbitraryTypeReader

所以我需要创建一个隐式值读取器?与当前一样,我得到:找不到net.ceedubs.ficus.readers.ValueReader类型的证据参数的隐式值-甚至添加
def loadConfiguration[T:ValueReader](隐式读取器:ArricryTypeReader):T={
无法解决此问题。同时为调用者导入
导入net.ceedubs.ficus.readers.ArbitraryTypeReader.\u
将无法解决此问题。不,您肯定不需要(或想要)隐式
任意类型读取器
,只有
值读取器
。根据上述定义,您可以导入
任意类型读取器。
(在使用站点,而不是定义
加载配置
)并调用
加载配置[EasyToDecode]
。我尝试按照您的指示操作-但它似乎还不起作用。
任意类型读取器。
在调用方端导入,即
加载配置[SomeCaseClass]
该方法看起来就像您建议的那样,但是:
无法生成配置…
的错误仍然存在。尝试
隐式val valueReader=valueReader[HashingConfiguration]
失败。@GeorgHeiler所说的“不起作用”是什么意思?是否有一个简单的case类(如答案中的一个)编译?那就奇怪了-
loadConfiguration[EasyToDecode]
对我来说编译得很好(这是我所期望的)。你同时导入了
Ficus.\u
ArbiryTypeReader.\u
import net.ceedubs.ficus.Ficus._
import net.ceedubs.ficus.readers.ValueReader
import com.typesafe.config.{ Config, ConfigFactory }

def loadConfiguration[T: ValueReader]: T = {
  val config: Config = ConfigFactory.load()
  config.as[T]

}
scala> ValueReader[Int]
res0: net.ceedubs.ficus.readers.ValueReader[Int] = net.ceedubs.ficus.readers.AnyValReaders$$anon$2@6fb00268