Scala上部类型边界的原始类型

时间:2017-03-08 06:24:26

标签: scala

我是Scala的新手,我想编写一个重载运算符的泛型类。但我想将类型限制为Int,Long和Double。是否可以为基本类型创建上层类型?

这是我为Int做的。我需要使这个类通用,它应该只接受Int,Long和Double。如果这不是正确的方法,我希望有人可以为问题提供替代解决方案。

class MyClass(value: Int) {
  def +(operand: Int): MyClass = { 
    return new MyClass(value+operand);
  }

  def -(operand: Int): MyClass = {
    return new MyClass(value-operand);
  }

  def *(operand: Int): MyClass = {
    return new MyClass(value*operand);
  }

  def /(operand: Int): MyClass = {
    return new MyClass(value/operand);
  }
} 

1 个答案:

答案 0 :(得分:3)

您可以使用Type Class Pattern。我需要隐式import { Injectable } from '@angular/core'; import { environment } from '../../../environments/environment'; @Injectable() export class UtilService { constructor() { } } 在范围内,并且仅针对所需的MyClassOperators[T]IntLong实施。

定义实施操作的特征:

Double

现在让我们为object MyClassImplicits { trait MyClassOperators[T <: AnyVal] { def +(firstOperand: T, secondOperand: T): MyClass[T] def -(firstOperand: T, secondOperand: T): MyClass[T] def *(firstOperand: T, secondOperand: T): MyClass[T] def /(firstOperand: T, secondOperand: T): MyClass[T] } 提供具体的实现:

Int

并更改implicit object MyClassIntOperators extends MyClassOperators[Int] { override def +(firstOperand: Int, secondOperand: Int): MyClass[Int] = new MyClass[Int](firstOperand + secondOperand) override def -(firstOperand: Int, secondOperand: Int): MyClass[Int] = new MyClass[Int](firstOperand - secondOperand) override def *(firstOperand: Int, secondOperand: Int): MyClass[Int] = new MyClass[Int](firstOperand * secondOperand) override def /(firstOperand: Int, secondOperand: Int): MyClass[Int] = new MyClass[Int](firstOperand / secondOperand) } 的定义,要求隐式MyClass在范围内:

MyClassOperators[T]

当我们使用class MyClass[T <: AnyVal : MyClassOperators](val value: T) { def doSomeAddition(otherValue: T): MyClass[T] = { implicitly[MyClassOperators[T]].+(value, otherValue) } } 实例运行时:

Int

收率:

def main(args: Array[String]): Unit = {
  val myClassOfInt = new MyClass[Int](1)
  println(myClassOfInt.doSomeAddition(2).value)
}

但是当我们使用3 实例(尚未实现)尝试此操作时:

Double