如何在Scala中使用POJO等效类?

25

假设我有以下内容

class SimpleClass (myInt: Int, myString: String) {

}
这个问题的错误在哪里?
val mySimple = new SimpleClass(1, "hi")
println(mySimple.myInt)
4个回答

30

如果你想让构造函数参数作为类的字段可用,你必须将它们声明为val或var:

class SimpleClass (val myInt: Int, val myString: String) {

}

6
或者将类声明为“case class”,这样你就可以免费获得这种功能。 - Dave Griffith
2
case class 更接近于 POJO;详情请参见:https://dev59.com/Zmkw5IYBdhLWcg3wwNN5 - Neil

17

如果您想要完整的POJO体验™,包括相等性、哈希码和合理的toString实现... 您将需要使用case类:

case class SimpleClass(myInt: Int, myString: String)

val mySimple = SimpleClass(1, "hi")
println(mySimple.myInt)

case class的参数会自动变成vals。如果需要,您可以将它们明确地设为vars,但在Scala中这种做法通常不被赞成 - 因为它更加支持不可变对象。


17

你的Scala定义在Java中的等价物是:

public class SimpleClass {
   public SimpleClass( int myInt, String myString ) {
   }
}

难怪它不工作...

嘿,伙计,这已经是你的第17个Scala问题了,而且你仍然困扰着语言的基础知识。也许你应该花一个下午阅读一些在线教程(或者某些书籍)来巩固你的知识。我可以建议以下资料:


3
问题在于你调用了SimpleClass.myInt的getter方法,但是你没有定义getter方法。你需要定义SimpleClass.myInt的getter方法,或者更好的方法是让Scala自动为你定义它:
class SimpleClass(val myInt: Int, myString: String) {}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接