我正在尝试重构一些我目前看起来像这样的模型:
case class Person(name: String, age: Int)
object Person {
implicit val reads: Reads[Person] = (
(JsPath \ "name").read[String] and
(JsPath \ "age").read[Int]
)(Person.apply _)
}
Run Code Online (Sandbox Code Playgroud)
看起来像这样的东西:
abstract class BaseModel {
val pk: String // Some stuff here that will be common
}
object BaseModel {
implicit val reads: Reads[BaseModel] // Not sure what to do here
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以做到这一点:
trait MyTrait[Model <: BaseModel] {
// More code here
val body: JsObject = ...
val parsed = body.validate[Model] // Error: There …Run Code Online (Sandbox Code Playgroud) 这是界面:
interface SomeInterface {
companion object {
const val MY_CONST = "the constant"
}
}
Run Code Online (Sandbox Code Playgroud)
然后,类(没有主体,因为只是一个例子):
class SomeClass : SomeInterface
Run Code Online (Sandbox Code Playgroud)
在此之后,当我尝试通过 SomeClass 调用常量时,它不允许我:
SomeClass.MY_CONST
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
我想让我的Scala代码更具可读性,因此我为所有参数化类型添加了自定义类型.
所以我在包对象中,为简单起见,
type IntSeq = Seq[Int]
Run Code Online (Sandbox Code Playgroud)
但是,现在我不能apply在伴侣对象上做简单.来自REPL:
scala> IntSeq(1, 2, 3)
<console>:8: error: not found: value IntSeq
IntSeq(1, 2, 3)
^
Run Code Online (Sandbox Code Playgroud)
该怎么办?
(只是为了确保:我的实际别名对象比这更复杂Seq[Int])
编辑:有一个类似的问题 - Scala类型别名包括伴侣对象[初学者]
在这个问题上,有两个回复,两个都不起作用.
一个是使用apply定义我的自定义对象,但我不知道如何在我的情况下这样做,再加上它有点冗长.
另一个 - 写入val IntSeq = Seq会产生错误
警告:先前定义的特征Seq不是值IntSeq的伴侣.同伴必须一起定义; 您可能希望使用:粘贴模式.
我正在尝试使用随播对象上提供的apply方法在Scala中实现工厂设计模式.我有以下方法.
sealed trait MyType {
def param: String
}
case class TypeA(param: String) extends MyType
case class TypeB(param: String, anotherParam: String) extends MyType
object MyType {
def apply(param: String): TypeA = ???
def apply(param, anotherParam: String): TypeB = ???
}
Run Code Online (Sandbox Code Playgroud)
现在,我如何在创建TypeA或的实例时强制上述特征的调用者通过伴随对象进行操作TypeB?
我想为已经定义的类的伴随对象添加一些扩展函数,比如
fun Toast.Companion.showImageToast(str : String) {
}
Run Code Online (Sandbox Code Playgroud)
而且我喜欢在界面上做同样的事情,例如
fun Runnable.Companion.mainHandler() {
}
Run Code Online (Sandbox Code Playgroud)
我已经查阅了文档,只是为用户定义的类中的伴随对象找到定义扩展函数的语法,而不是没有伴随对象的类.
我有机会在kotlin这样做吗?
我有一个抽象类:
和扩展类:
Vec2t有以下配套对象:
companion object {
@JvmField val length = 2
}
Run Code Online (Sandbox Code Playgroud)
但是当我输入时Vec2.length,它被标记为未解决的参考...
为什么?我错过了什么?
如何让 Scala 编译器自动生成 case 对象?
// Pizza class
class Pizza (val crust_type: String)
// companion object
object Pizza {
val crustType = "crust_type"
}
Run Code Online (Sandbox Code Playgroud)
案例对象的所需属性
case class生成一个属性case objectcamelCase到snake_case该对象的属性名,保持snake_case为对象的属性值我收到错误消息“Parcelable 协议需要一个名为 CREATOR 类的 Parcelable.Creator 对象......”,但我确实有一个 Creator,但我不知道它有什么问题。我从https://developer.android.com/reference/android/os/Parcelable复制它并更改了类名以适合我的代码。我怀疑从 Java 到 Kotlin 的(自动)转换并不完美(或者准确地说:它是否与需要的略有不同),但我不知道问题到底是什么。
有一个具有相同错误消息的线程(Parcelable 协议需要一个名为 CREATOR(我确实有 CREATOR)的Parcelable.Creator对象),但问题在于“fun writeToParcel”的写入顺序与读取顺序不同“有趣的数据处理程序”。在我的情况下,这不是问题,因为它的顺序相同。
那里的另一个答案指出,函数需要是静态的可能是一个问题。但是,Kotlin 没有“静态”功能。我读到它是用“同伴对象”完成的。我试过了(见下文),但它引发了另一个错误 - 我不确定它是否会起作用。
class DataHandler : Parcelable {
var player1name = ""
var player1color = 0
//main constructor
fun DataHandler(player1name: String, player1color: Int) {
this.player1name = player1name
this.player1color = player1color
}
//write object values to parcel for storage
override fun writeToParcel(dest: Parcel, flags: Int) {
//write all properties to the parcle
dest.writeString(player1name)
dest.writeInt(player1color)
}
//constructor used for …Run Code Online (Sandbox Code Playgroud) 是什么原因
trait Dog {
def bark = "woof"
}
object Dog extends Dog
Run Code Online (Sandbox Code Playgroud)
有效,但以下内容不起作用
trait Dog {
def bark = "woof"
}
class Dog extends Dog
Run Code Online (Sandbox Code Playgroud)
我在某处读到,在上述第一种情况下,该对象不是伴随对象。对象和特征应具有相同的名称时会发生什么情况?
import org.json.JSONObject
JSONObject deviceInformation = ...
Run Code Online (Sandbox Code Playgroud)
我试图创建一个像这样的伴随对象,但没有真正起作用......对不起,Java和Kotlin中的菜鸟......

是的,JSONObject 是正确导入的
import org.json.JSONObject
companion-object ×10
kotlin ×5
scala ×5
inheritance ×2
android ×1
case-class ×1
generics ×1
interface ×1
java ×1
parcel ×1
parcelable ×1
scala-macros ×1
scalameta ×1
traits ×1