[英]Scala: conforming concrete type to generics with bounds
我已经使用泛型定义了一个函数,我在理解编译器给出的错误时遇到了一些麻烦。 问题可以简单地表达为:
def myfunc[T <: MyClass](param:MyClass):T = param
它在我体内的param
上给出了这个错误:MyClass类型的表达式不符合预期的类型T.
为什么? param
适合T的上限。我怎样才能在不借助于向T投射参数的情况下制作这样的作品呢?
好。 假设你有以下内容:
class Animal
class Dog extends Animal
现在让我们的功能如下:
def myfunc[T <: Animal](param:Animal):T = param
现在假设,编译器不会抛出错误。 在调用myfunc[Dog](new Animal)
,它应该根据函数定义返回一个Dog
。 但实际上,你只是寄回Animal
。 哪个不应该被允许。 因此错误。
现在它曾经:
def myfunc[T >: Dog](param:Dog):T = param
在这里调用myfunc[Animal](new Dog)
。 返回类型是Animal
。 但该函数返回一个Dog
,这是正确的,因为Dog
是一个Animal
。 希望它澄清一下
你有向后的差异。 如果T <: MyClass
,那么你可以提供一个预期MyClass
的T
但你不能给出一个MyClass
,其中T
是预期的。
为了显示:
def myfunc(x: Any): String = x
出于同样的原因,这会产生相同的错误。 Any
不是String
,而你的MyClass
不是T
这就是你的意思:
def myfunc[T >: MyClass](param:MyClass):T = param
哪个工作正常。
看这个:
class A(); class B extends A;
scala> def myfunc[T <: A,U >: A](param: U):T = param
<console>:8: error: type mismatch;
found : param.type (with underlying type U)
required: T
def myfunc[T <: A,U >: A](param: U):T = param
你的param:MyClass
确实有一个下限( >: MyClass
),就像在Java中一样 - 它可以是MyClass
任何后代。 那么,你如何运行myfunc(B)
并返回类图比A
更高的类型? B在继承图中被认为低于A,你返回B但是它确实是<: A
。 错误。
有时显式声明所有类型,如T,U,V等,看看编译器说的是什么。
你认为param与T有关的假设因为它们共有一个共同的祖先是错误的。
例如,基类A可以有两个子类B和C. 如果T是B类型而param是C类型,则param不是与T相关的类型。
我希望能帮助你。
参数类型是T而不是MyClass。
object StackOverFlow13851352 extends App {
class MyClass
class YourClass extends MyClass
def myfunc[T <: MyClass](param: T): T = param
val clazz: YourClass = myfunc(new YourClass)
}
Scala代码运行器版本2.10.0-RC2 - 版权所有2002-2012,LAMP / EPFL
java版“1.7.0_09”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.