【问题标题】:Scala: Case class with generic function argumentScala:具有通用函数参数的案例类
【发布时间】:2019-11-12 09:12:00
【问题描述】:

我有以下案例类。

case class CustomAttributeInfo[T,Y](
          attribute:MyAttribute[_],
          fieldName:String, 
          valueParser:T => Y){}

case 类采用三个值。

最后一个参数是一个函数,它将解析任何类型的输入并返回我们希望保留的输入部分。

(想象一下,仅举一个例子,我传入一个 jsonstring,转换为 json 对象,然后提取一个 Int)。

伴生对象将提供一系列我们可以传递给案例类的函数。这里显示的只是将输入作为字符串并将其作为字符串返回(最简单的示例)。

object CustomAttributeInfo {

  val simpleString = (s:String) => s
}

我创建案例类如下:

CustomAttributeInfo(MyAttribute(var1, var2), name, CustomAttributeInfo.simpleString)

稍后,我将函数称为“valueParser”

customAttributeInfo.valueParser(k)

编译错误

错误:(366, 69) 类型不匹配; 找到:k.type(具有底层类型字符串) 需要:_$13 case Some(info) => Some((info.attribute, info.valueParser(k)))

我不是泛型专家(显然)。我做了一些阅读,但我还没有看到关于这样一个案例的讨论。任何建议和解释都将受到欢迎

【问题讨论】:

    标签: scala generics


    【解决方案1】:

    您没有提供足够的信息来回答您的问题。

    以下代码编译。

    如果您仍然有编译错误,请提供MCVE

      case class MyAttribute[_](var1: Any, var2: Any)
    
      case class CustomAttributeInfo[T,Y](attribute:MyAttribute[_], fieldName:String, valueParser:T => Y) {}
    
      object CustomAttributeInfo {
    
        val simpleString = (s:String) => s
      }
    
      val var1: Any = ???
      val var2: Any = ???
      val name: String = ???
      val customAttributeInfo = CustomAttributeInfo(MyAttribute(var1, var2), name, CustomAttributeInfo.simpleString)
    
      val k = "abc"
      customAttributeInfo.valueParser(k)
    

    【讨论】:

    • 谢谢。我刚刚意识到 MCVE 确实可以编译并运行。我会再调试一下,然后尝试更新我的问题。但是要明确一点,k 应该是一个字符串,也就是 valueParser() 的参数,不是吗?
    【解决方案2】:

    @Dmytro 是正确的,编译了一个简单的示例。然而,在我的实际代码库代码中,我们需要具体说明类型。

    这行得通:

    object CustomAttributeInfo {
    
      type T = Any
    
      val simpleString = (s:T) => s.toString
    }
    

    【讨论】:

    • 1.您不能在标准 Scala 中扩展 object(有一个编译器选项允许它); 2. 即使它是一个类/特征,你也只能在覆盖类型成员时添加更多要求,当它已经完全知道它不能更改时。
    • 很公平。我会调查的。如果你是正确的,我会更新
    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多