我是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);
}
}
答案 0 :(得分:3)
您可以使用Type Class Pattern。我需要隐式import { Injectable } from '@angular/core';
import { environment } from '../../../environments/environment';
@Injectable()
export class UtilService {
constructor() { }
}
在范围内,并且仅针对所需的MyClassOperators[T]
,Int
和Long
实施。
定义实施操作的特征:
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