java - 从接口(interface)转换为特征

标签 java scala

下面是我如何使用 Java 接口(interface)构建通用契约来实现某项功能的示例:

package main.java;

public class Main {

    interface Calculate {
        public int run();
    }

    private class Calc1 implements Calculate {

        @Override
        public int run() {
            return 1;
        }

    }

    private class Calc2 implements Calculate {

        @Override
        public int run() {
            return 0;
        }

    }

    public static void main(String args[]){

        Main m = new Main();

        Calculate c = m.new Calc1();
        System.out.println(c.run());

        c = m.new Calc2();
        System.out.println(c.run());


    }

}

这里是我如何重新实现与上面相同的逻辑的转向 Scala 特征:

package main.scala

object traitsfun {
  println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheet

  trait Calc {
    def run: Int
  }

  class Calc1 extends Calc {
    override def run = 1
  }

  class Calc2 extends Calc {
    override def run = 0
  }

  val c1 = new Calc1().run                        //> c1  : Int = 1
  val c2 = new Calc2().run                        //> c2  : Int = 0
}

这就是 Scala 特征的使用方式吗?

最佳答案

这个例子对我来说似乎没问题。几点说明:

1) 如果您有不改变的特征成员,请考虑将它们声明为lazy val。惰性 val 仅评估一次(第一次需要时),而 def 则在每次调用时评估。

2) 如果您想阻止其他类继承您的特征,请考虑将其声明为密封特征。这意味着只有在同一文件中声明的子类才会被接受。

3) 在 Scala 中实例化类不需要空括号。

4) Scala 特性与 Java 接口(interface)最重要的区别是它们还可以包含方法的实现,而不仅仅是声明它们。 (你好,多重继承:))

考虑到所有这些,我们可以按以下方式重写您的特定示例:

package main.scala

object traitsfun {
  println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheet

  sealed trait Calc {
    lazy val run: Int = 0 // val should have a default value
    def standardMethod(param:String) = println(s"Hello $param")
  }

  class Calc1 extends Calc {
    override lazy val run = 1
  }

  class Calc2 extends Calc {
    override lazy val run = 0
  }

  val c1 = (new Calc1).run                        //> c1  : Int = 1
  val c2 = (new Calc2).run                        //> c2  : Int = 0
  (new Calc1).standardMethod("Calc1")             //> "Hello Calc1"
}

(当然,所有这些只是通过非常基本的示例来了解皮毛:))

关于java - 从接口(interface)转换为特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24193354/

相关文章:

java - 包含总是返回 false

scala - 如何设置 sbt/scala/play 多模块项目,它可以与 Intellij scala 插件一起正常工作

scala - SBT 未解决 Squeryl 依赖关系

java - OWLAPI 和声明公理要求

java - 用 1,2...n 填充数组的最短方法

java - 如何在 Java 中仅初始化一次局部变量

scala - Scala中Any和String之间的类型不匹配

web-services - spray-can webservice 优雅关闭

java - ByteBuffer 中的 NullPointerException

java - JSch 算法协商仅在单元测试中失败