[scala基础]--使用get/set方法、toString和构造方法

本文通过具体示例介绍了Scala中类的定义方法,包括如何使用构造方法、get/set方法及toString方法。同时展示了case class的特性,并通过Student类演示了有参构造方法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

举例说明scala的get/set方法
package scalaClass.ConstructorExample

/**
  * Document:本类作用---->get/set
  * User: yangjf
  * Date: 2016/8/25  21:15
  */
object PersonInfo {
  def main(args: Array[String]) {
    val p = new Person("Jonathan")
    p.name = "Jony" // setter method
    println(p.name) // getter method
    println(new Person("gg"))//toString()方法
    println(new Person())//toString()方法

  }
}
 case class Person(private var _name: String) {
  def this()=this("Tom")                   //构造方法,添加默认值
  def name = _name                            // accessor访问
  def name_=(aName: String) { _name = aName } // mutator---->突变
  override def toString()=s" teacher name : $name"
}
//有参构造方法
class Student extends Serializable{
   var age = 0L
   var score = 0L
   var content = ""
  def this(age: Long,score:Long,content:String) {
    this()
    this.age = age
    this.score = score
    this.content = content
  }
  override def toString(): String ={
    this.age+" "+this.score+" "+this.content
  }
}


/*
Jony
name : gg
name : Tom
*/
参考:
https://docs.scala-lang.org/tour/classes.html


                
我这个是在Ubuntu运行sbt run发生的 root@Ubuntu:/home/rt/chisel-examples/hello-world# sbt run [info] welcome to sbt 1.10.11 (Ubuntu Java 21.0.6) [info] loading project definition from /home/rt/chisel-examples/hello-world/project [info] loading settings for project hello-world from build.sbt... [info] set current project to hello-world (in build file:/home/rt/chisel-examples/hello-world/) [info] compiling 1 Scala source to /home/rt/chisel-examples/hello-world/target/scala-2.12/classes ... [info] Non-compiled module 'compiler-bridge_2.12' for Scala 2.12.15. Compiling... error: bad constant pool index: 0 at pos: 48454emental 2s while compiling: <no file> during phase: globalPhase=<no phase>, enteringPhase=<some phase> library version: version 2.12.15 compiler version: version 2.12.15 reconstructed args: -bootclasspath /root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.15/scala-library-2.12.15.jar -nowarn -classpath /root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.10.8/compiler-interface-1.10.8.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/util-interface/1.10.7/util-interface-1.10.7.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.10.8/compiler-bridge_2.12-1.10.8-sources.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.15/scala-compiler-2.12.15.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.15/scala-reflect-2.12.15.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/1.0.6/scala-xml_2.12-1.0.6.jar:/root/.cache/coursier/v1/https/repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar -d /tmp/sbt_bc12c207 -Xmaxwarns 0 last tree to typer: EmptyTree tree position: <unknown> tree tpe: <notype> symbol: null call site: <none> in <none> =
03-27
<think>好的,我现在需要解决用户在Ubuntu上运行sbt时遇到的编译错误,具体是“bad constant pool index”问题,使用Scala版本是2.12.15。首先,我需要理解这个错误的原因。 根据用户提供的引用内容,尤其是引用[2]提到SBT支持跨版本编译,可以设置不同的Scala版本。而引用[3][4]中使用Scala版本是2.12.18,这可能暗示版本兼容性问题。用户当前使用的是2.12.15,可能存在与某些依赖库的版本冲突,导致常量池索引错误。 接下来,我应该考虑几个可能的原因。首先,检查项目的Scala版本是否与其他依赖库兼容。例如,如果某些库是为更高版本的Scala编译的,可能会引发此类问题。其次,检查JDK版本是否与Scala 2.12.15兼容。Scala 2.12通常需要JDK 8或11,如果用户使用的是更新的JDK版本,可能会出现兼容性问题。 另外,清理sbt的缓存也是一个常见的解决步骤,因为旧的缓存文件可能损坏或与新设置冲突。用户可以通过删除`target`目录`sbt.boot`目录来清理缓存。此外,确保项目中的交叉编译设置正确,支持当前的Scala版本,如引用[2]中提到的设置`supportedScalaVersions`。 如果问题依旧,可能需要升级Scala版本到2.12.18,如引用[3][4]中的版本,或者检查依赖库是否有更新版本兼容当前Scala版本。同时,检查IDE(如IDEA)中的Scala插件是否与项目版本一致,避免版本不匹配导致的语法问题,如引用[1]所述。 最后,如果所有方法都无效,建议用户提供完整的错误日志`build.sbt`文件内容,以便更精准地诊断问题。</think>### 逐步解决方案 #### 1. **确认Scala版本与依赖兼容性** - **检查`build.sbt`中的Scala版本声明**: ```scala scalaVersion := "2.12.15" // 确保此处与本地安装的Scala版本一致 ``` 若本地安装的是其他版本(如2.12.18),需同步修改[^3][^4]。 - **检查依赖库的Scala版本兼容性**:部分库可能仅支持特定Scala版本。例如,Spark 3.4.1要求Scala 2.12.18[^5],若使用2.12.15可能引发冲突。 #### 2. **清理sbt缓存** ```bash # 进入项目目录后执行 sbt clean # 清理编译缓存 rm -rf ~/.sbt # 删除全局sbt配置缓存(谨慎操作,会重置sbt设置) rm -rf ~/.ivy2/cache # 清理依赖缓存 ``` #### 3. **升级Scala版本** - 将`build.sbt`中的Scala版本调整为更稳定的2.12.18(与Spark 3.4.1兼容): ```scala scalaVersion := "2.12.18" ``` #### 4. **检查JDK版本** - Scala 2.12.x要求**JDK 8或11**,若使用JDK 17+可能引发`bad constant pool index`错误: ```bash java -version # 确认JDK版本 ``` - 若版本不匹配,通过以下方式切换: ```bash sudo update-alternatives --config java # 选择兼容的JDK版本 ``` #### 5. **检查交叉编译设置** - 若项目支持多版本Scala编译,需在`build.sbt`中明确声明支持的版本范围[^2]: ```scala crossScalaVersions := Seq("2.12.15", "2.12.18") // 添加兼容版本 ``` #### 6. **检查IDE插件一致性** - 确保IDEA的Scala插件版本与项目Scala版本匹配(如IDEA 2019.2.3对应Scala 2.12.x)[^3]。 #### 7. **验证依赖冲突** - 执行`sbt dependencyTree`查看依赖树,检查是否有版本冲突: ```bash sbt dependencyTree > dependencies.txt ``` - 若存在冲突,通过`exclude`排除旧版本依赖: ```scala libraryDependencies += ("org.example" % "module" % "1.0").exclude("org.conflict", "artifact") ``` --- ### 常见错误场景与修复示例 #### 场景1:Spark依赖与Scala版本不匹配 ```scala // build.sbt错误配置示例 libraryDependencies += "org.apache.spark" %% "spark-core" % "3.4.1" // 需要Scala 2.12.18 ``` **修复**:升级Scala版本至2.12.18或降级Spark至适配2.12.15的版本。 #### 场景2:JDK版本过高 ```log 错误信息: java.lang.ClassFormatError: Bad constant pool index ``` **修复**:切换至JDK 8或11。 --- ### 相关问题 1. **如何排查sbt项目的依赖冲突?** > 使用`sbt dependencyTree`生成依赖树,或通过`sbt evicted`查看被排除的版本[^2]。 2. **如何在Ubuntu上管理多个JDK版本?** > 使用`update-alternatives --config java`切换默认JDK。 3. **为什么需要配置SBT的交叉编译?** > 跨版本编译确保代码在不同Scala版本下兼容。 4. **IDEA中如何正确关联Scala SDK?** > 在Project Structure中手动指定SDK路径,确保与`build.sbt`中的版本一致[^1]。 --- ### 引用 [^1]: Scala版本与IDE插件不匹配会导致语法解析错误。 : SBT通过`crossScalaVersions`支持多版本编译。 : Spark 3.4.1需搭配Scala 2.12.18。 [^4]: IDEA需正确配置Scala插件SDK路径。 : Spark RDD代码需兼容Scala版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oo寻梦in记

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值