作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想要一个具有静态可用函数(由特征收缩)的类。然后我想要一个类型参数化方法,它采用这样的类型作为其类型参数并访问契约静态函数。 (是的,我知道静态一词是 Java 而不是 Scala,但你知道我的意思。)
我知道在 Scala 中拥有静态函数的唯一方法是让伴随对象扩展特征。然而这样做有两个问题:
这可能完全关闭,但我想做的是:
MyTrait {
def MyFunction() : Any //some function
}
case class MyClass(i: Int)
object MyClass extends MyTrait {
def MyFunction() = {/*do stuff*/}
}
//need the type as a class not an object because I need it for a higher order function like this
def SomeFunctionHigherOrderFunction[T /*constrain T such that the companion object of T <: MyTrait*/](someFunc : Function1[T, Any]) : Unit {
val someStuff = T.MyFunction()
/*use someStuff in here*/
}
SomeFunctionHigherOrderFunction[T](/*provide a Function1[T, Any]*/);
关于正确解决方案或解决此问题的更好方法的任何想法?
提前致谢!
最佳答案
没有办法做到这一点。您可以采用的一种方法是通过隐式传递方法(这也称为类型类方法)。您需要通过 T
参数化您的特征(即使您不使用它,T
也用于解析正确的隐式)。
trait MyTrait[T] {
def MyFunction() : Any //some function (usually you want to use `T` somehow)
}
然后,您将伴生对象声明为隐式对象。像这样
implicit object MyClass extends MyTrait[MyClass] {
def MyFunction = ...
}
或者,如果该对象中没有任何其他内容,您甚至可以直接内联:
implicit val myTraitMyClass: MyTrait[MyClass] = new MyTrait[MyClass] {
def MyFunction = ...
}
并通过
使用它def SomeHigherOrderFunction[T](someFunc : Function1[T, Any])(implicit o: MyTrait[T]): Unit {
val someStuff = o.MyFunction()
/*use someStuff in here*/
}
关于伴随类型的 Scala 类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260122/
我有两个伴随的仿函数,即它们成对出现如果一个是 doX() ,另一个将是 undoX()。 它们是这样声明的: template struct doSomething{
我想看看是否有任何工具或引擎可以将 Ecore(元)模型转换为合金规范? 如果它在考虑伴随的 OCL 表达式的情况下进行这种翻译,那就太好了 :) 谢谢 最佳答案 关于在 Alloy 和 UML 之间
所以我正在按照 ASP.NET 和 MVC 5 一书中的示例进行操作。这是导致错误的 View : @model SportsStore.WebUI.Models.ProductsListViewMo
我是一名优秀的程序员,十分优秀!