Scala 中的类型参数与 Any
Type parameter vs Any in Scala
我有一个 class RBase 和一个继承自它的 RInt class。
Base 具有三个接口函数。由于继承的 subclasses 可以使用不同类型的值,因此函数参数类型为 Any。结果,我需要使用 asInstanceOf
来实现 subclasses。这是一个例子。
abstract class RBase(val name:String)
{
def encode(value:Any) : Array[Byte]
def decode(byteArray: Array[Byte]) : Any
def check(value:Any) : Boolean
}
class RInt extends RBase("int")
{
override def encode(value: Any) = {
val byteValue = value.asInstanceOf[Int]
Array[Byte](byteValue.toByte, byteValue.toByte, byteValue.toByte)
}
override def decode(byteArray: Array[Byte]) : Any = {
byteArray.size
}
override def check(value:Any) : Boolean = {
val byteValue = value.asInstanceOf[Int]
if (byteValue.toInt > 0) true
else false
}
}
object Main extends App {
val b = new RInt
println(b.decode(Array[Byte]()))
println(b.encode(100).mkString(":"))
println(b.check(-1))
}
// uncomment when compile
Main.main(args)
我认为 Any
和 asInstanceOf
可以使用类型参数删除。这是我的第一次尝试。
abstract class TBase(val name:String)
{
def encode[T](value:T) : Array[Byte]
def decode[T](byteArray: Array[Byte]) : T
def check[T](value:T) : Boolean
}
class TInt extends TBase("bit")
{
override def encode[Int](value: Int) = {
Array[Byte](value.toByte, value.toByte, value.toByte)
}
override def decode[Int](byteArray: Array[Byte]) : Int = {
byteArray.size
}
override def check[Int](value:Int) : Boolean = {
if (value > 0) true
else false
}
}
object Main extends App {
val b = new TInt
println(b.decode(Array[Byte]()))
}
// uncomment when compile
Main.main(args)
不幸的是,我收到以下错误消息。
T.scala:11: error: value toByte is not a member of type parameter Int
Array[Byte](value.toByte, value.toByte, value.toByte)
^
T.scala:11: error: value toByte is not a member of type parameter Int
Array[Byte](value.toByte, value.toByte, value.toByte)
^
T.scala:11: error: value toByte is not a member of type parameter Int
Array[Byte](value.toByte, value.toByte, value.toByte)
^
T.scala:14: error: type mismatch;
found : scala.Int
required: Int(in method decode)
byteArray.size
^
T.scala:17: error: value > is not a member of type parameter Int
if (value > 0) true
^
5 errors found
- Q1:如何改进使用 Any 和 asInstanceOf 的 RBase 方法?
- Q2:TBase有什么问题?
您的想法非常接近。参数化整个 class 而不是单个方法。
abstract class TBase[T](val name: String) {
def encode(value: T): Array[Byte]
def decode(byteArray: Array[Byte]): T
def check(value: T): Boolean
}
class TInt extends TBase[Int]("bit") {
override def encode(value: Int) = {
Array[Byte](value.toByte, value.toByte, value.toByte)
}
override def decode(byteArray: Array[Byte]): Int = {
byteArray.size
}
override def check(value: Int): Boolean = {
if (value > 0) true
else false
}
}
编辑:回答为什么您的代码不起作用 - 因为您使用名为 "Int" 的类型参数化了该方法。编译器认为它只是类型的名称(可以是 T、U、Int 等)。所以 return 类型在那种情况下不是 "real Int" ,而是你虚构的类型。
我有一个 class RBase 和一个继承自它的 RInt class。
Base 具有三个接口函数。由于继承的 subclasses 可以使用不同类型的值,因此函数参数类型为 Any。结果,我需要使用 asInstanceOf
来实现 subclasses。这是一个例子。
abstract class RBase(val name:String)
{
def encode(value:Any) : Array[Byte]
def decode(byteArray: Array[Byte]) : Any
def check(value:Any) : Boolean
}
class RInt extends RBase("int")
{
override def encode(value: Any) = {
val byteValue = value.asInstanceOf[Int]
Array[Byte](byteValue.toByte, byteValue.toByte, byteValue.toByte)
}
override def decode(byteArray: Array[Byte]) : Any = {
byteArray.size
}
override def check(value:Any) : Boolean = {
val byteValue = value.asInstanceOf[Int]
if (byteValue.toInt > 0) true
else false
}
}
object Main extends App {
val b = new RInt
println(b.decode(Array[Byte]()))
println(b.encode(100).mkString(":"))
println(b.check(-1))
}
// uncomment when compile
Main.main(args)
我认为 Any
和 asInstanceOf
可以使用类型参数删除。这是我的第一次尝试。
abstract class TBase(val name:String)
{
def encode[T](value:T) : Array[Byte]
def decode[T](byteArray: Array[Byte]) : T
def check[T](value:T) : Boolean
}
class TInt extends TBase("bit")
{
override def encode[Int](value: Int) = {
Array[Byte](value.toByte, value.toByte, value.toByte)
}
override def decode[Int](byteArray: Array[Byte]) : Int = {
byteArray.size
}
override def check[Int](value:Int) : Boolean = {
if (value > 0) true
else false
}
}
object Main extends App {
val b = new TInt
println(b.decode(Array[Byte]()))
}
// uncomment when compile
Main.main(args)
不幸的是,我收到以下错误消息。
T.scala:11: error: value toByte is not a member of type parameter Int
Array[Byte](value.toByte, value.toByte, value.toByte)
^
T.scala:11: error: value toByte is not a member of type parameter Int
Array[Byte](value.toByte, value.toByte, value.toByte)
^
T.scala:11: error: value toByte is not a member of type parameter Int
Array[Byte](value.toByte, value.toByte, value.toByte)
^
T.scala:14: error: type mismatch;
found : scala.Int
required: Int(in method decode)
byteArray.size
^
T.scala:17: error: value > is not a member of type parameter Int
if (value > 0) true
^
5 errors found
- Q1:如何改进使用 Any 和 asInstanceOf 的 RBase 方法?
- Q2:TBase有什么问题?
您的想法非常接近。参数化整个 class 而不是单个方法。
abstract class TBase[T](val name: String) {
def encode(value: T): Array[Byte]
def decode(byteArray: Array[Byte]): T
def check(value: T): Boolean
}
class TInt extends TBase[Int]("bit") {
override def encode(value: Int) = {
Array[Byte](value.toByte, value.toByte, value.toByte)
}
override def decode(byteArray: Array[Byte]): Int = {
byteArray.size
}
override def check(value: Int): Boolean = {
if (value > 0) true
else false
}
}
编辑:回答为什么您的代码不起作用 - 因为您使用名为 "Int" 的类型参数化了该方法。编译器认为它只是类型的名称(可以是 T、U、Int 等)。所以 return 类型在那种情况下不是 "real Int" ,而是你虚构的类型。