繁体   English   中英

Scala:将具体类型与带有边界的泛型相符

[英]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 ,那么你可以提供一个预期MyClassT 但你不能给出一个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等,看看编译器说的是什么。

你认为paramT有关的假设因为它们共有一个共同的祖先是错误的。

例如,基类A可以有两个子类BC. 如果TB类型而paramC类型,则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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM