代码之家  ›  专栏  ›  技术社区  ›  Josh Stone

使用scala泛型时出现意外的类型不匹配

  •  2
  • Josh Stone  · 技术社区  · 6 年前

    我有一个简单的场景,在使用scala泛型时会产生类型不匹配,不清楚为什么或者如何解决它。

    trait Foo
    case class Bar() extends Foo
    
    trait FooGetter[T <: Foo] {
      def get: T = Bar() // Error
    }
    

    错误:

    类型不匹配;找到: 所需钢筋:t

    有什么暗示吗?

    3 回复  |  直到 6 年前
        1
  •  1
  •   chenzhongpu    6 年前

    在这里 T <: Foo 方法 Foo 上界 类型的 T .

    enter image description here

    如你所见,两者之间没有关系 Bar T ,因此不能以隐式方式进行转换。

    当然,如果你能保证铸造的安全,你可以用 asInstanceOf 以明确的方式。

    另一方面,当 T 是最棒的时候 是孩子。

    trait FooGetter[T >: Foo] {
      def get: T = Bar()
    }
    
        2
  •  0
  •   Erik van Oosten    6 年前

    您可以这样简化代码:

    trait Foo
    case class Bar() extends Foo
    
    trait FooGetter {
      def get: Foo = Bar()
    }
    

    FooGetter Foo 无论如何,没有必要 福格特 通用的。(注: Bar 是一个 对于scala类型检查器。)

        3
  •  0
  •   pme    6 年前

    一直有效的是 asInstanceOf ,在您的示例中:

    trait Foo
    case class Bar() extends Foo
    
    trait FooGetter[T <: Foo] {
      def get: T = Bar().asInstanceOf[T]
    }
    

    所以这是有效的:

    println(new FooGetter[Bar]{}.get) // Bar()
    

    但是 正如塞思·蒂苏指出的:

    如果生成的代码不是 实际上是普通的。