【问题标题】:Use of abstract type in a concrete class? [duplicate]在具体类中使用抽象类型? [复制]
【发布时间】:2013-09-28 00:47:10
【问题描述】:
scala> class A { type T <: String; def f(a: T) = println("foo")}
defined class A

scala> (new A).f("bar")
<console>:9: error: type mismatch;
found   : java.lang.String("bar")
required: _1.T where val _1: A
             (new A).f("bar")
                       ^

A 有一个抽象类型T,但不是抽象类。创建A 的对象(如图所示)不会定义类型T

我的第一个想法是,我可以将任何类型作为 T 传递,这是 String 的子类,但我不是。那么对象中的T实际上是什么类型,我可以通过什么?

【问题讨论】:

    标签: scala abstract-type


    【解决方案1】:

    正如你所说,A 中的T 是抽象的;因此,您将找不到任何可以放入方法 f 的值,直到您拥有 A 的子类型,它实际上修复了 T

    (new A { type T = String }).f("bar")
    

    想法是类型可以依次细化:

    trait Var[A] { def get: A; def set(v: A): Unit }
    
    trait Sys {
      type V[A] <: Var[A]
    
      def swap[A](x: V[A], y: V[A]): Unit = {
        val tmp = x.get
        x.set(y.get)
        y.set(tmp)
      }
    }
    
    trait HistVar[A] extends Var[A] { def created: java.util.Date }
    
    trait HistSys extends Sys {
      type V[A] <: HistVar[A]
    
      def newest[A](x: V[A], y: V[A]): A =
        if (x.created after y.created) x.get else y.get
    }
    

    当然你的问题是好的——你没有理由想要一个类型参数不固定的类的具体实例化。我想不出一个有意义的案例。 (当然,如果不涉及 T 类型,您仍然可以拥有可访问的功能)


    进一步搜索发现以下类似重复的SO question。您可以在那里找到对Scala ticket 的引用,该引用将其概述为“功能”——仍然没有显示此“功能”实际上有用的情况:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 2012-05-15
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      相关资源
      最近更新 更多