小编pau*_*lyb的帖子

scala泛型和继承

我在scala中遇到以下层次结构的问题:

class ScalaGenericTest {
  def getValue[A, B <: Abstract[A]](clazz: B): A = clazz.a

  def call: String = {
    val sub: Subclass = new Subclass
    getValue(sub)
  }
}

class Subclass extends Abstract[String] {
  def a: String = "STRING"
}

abstract class Abstract[A] {
  def a: A
}
Run Code Online (Sandbox Code Playgroud)

编译器似乎无法在对getValue函数的调用中绑定泛型参数A - 我认为它应该能够从Subclass的定义中推断出这一点.编译错误如下:

推断类型参数[Nothing,Subclass]不符合方法getValue的类型参数bounds [A,B <:Abstract [A]]

如果我明确地将泛型类型参数传递给方法,它可以工作,getValue[String,Subclass](sub)但是肯定编译器应该能够推断出这个吗?

相同的层次结构在Java中运行良好:

public class JavaGenericTest {

    public  <T,U extends Abstract<T>> T getValue(U subclass) {
         return subclass.getT();
    }

    public String call(){
        Subclass sub = new Subclass(); …
Run Code Online (Sandbox Code Playgroud)

generics scala

10
推荐指数
1
解决办法
731
查看次数

标签 统计

generics ×1

scala ×1