了解Scala隐式转换和泛型类型推断

时间:2015-06-23 22:04:00

标签: scala

trait LowPriorityOrderingImplicits {
  implicit def ordered[A <: Ordered[A]]: Ordering[A] = new Ordering[A] {
    def compare(x: A, y: A) = x.compare(y)
  }
}

上面的代码是做什么的?

  1. A&lt;:Ordered [A]是什么意思? A如何成为Ordered [A]的子类型?
  2. “新订购[A] {......”到底是做什么用的?它是否为Ordering [A]创建了一个新的匿名类?
  3. 此外,对于此代码(取自DataStax Cassandra Connector

            object TableWriter{
              def apply[T : RowWriterFactory](
              connector: CassandraConnector,
              keyspaceName: String,
              tableName: String,
              columnNames: ColumnSelector,
              writeConf: WriteConf): TableWriter[T] = {
                ...//some code
                val rowWriter = implicitly[RowWriterFactory[T]].rowWriter(tableDef, selectedColumns)
                new TableWriter[T](connector, tableDef, rowWriter, writeConf)
              }
            }
            val writer = TableWriter(connector, keyspaceName, tableName, columns, writeConf) // first call
    
            def saveToCassandra(keyspaceName: String,
                              tableName: String,
                              columns: ColumnSelector = AllColumns,
                              writeConf: WriteConf = WriteConf.fromSparkConf(sparkContext.getConf))
                             (implicit connector: CassandraConnector = CassandraConnector(sparkContext.getConf),
                              rwf: RowWriterFactory[T]): Unit = {
                 val writer = TableWriter(connector, keyspaceName, tableName, columns, writeConf)// 2nd call
            }
    
    1. 如何推断T的类型?
    2. rwf隐式参数的目的是什么?
    3. TableWriter的第一次和第二次调用之间有什么区别?

1 个答案:

答案 0 :(得分:0)

  

A&lt;:Ordered [A]是什么意思? A如何成为有序[A]的子类型?

让我们看一下Ordered

的定义
trait Ordered[A] extends Any with java.lang.Comparable[A] {

  def compare(that: A): Int

  /* ... */
}

如果我们说A <: Ordered[A],那么我们会指定A的实例与A的其他实例相当。为什么在特定情况下这是必要的?嗯......说我们有

implicit def ordered[B, A <: Ordered[B]]: Ordering[A] = new Ordering[A] {
  def compare(x: A, y: A) = x.compare(y)
}

此代码无法编译,因为Ordered[B]没有方法compare(x: A)(请注意y的类型为A)。

  

“新订购[A] {......”到底是做什么用的?它是否为Ordering [A]创建了一个新的匿名类?

是的,这是一个匿名课程。

  

如何推断T的类型?

T: RowWriterFactory是受上下文限制的。另请参阅Scala doc about type tags and manifests

据我所知,

def foo[T: RowWriterFactory](x: Int) 

与写作相同

def foo[T](x: Int)(implicit evidence: RowWriterFactory[T])
  

rwf隐式参数的目的是什么?

这是从上一个问题的答案得出的:它是上下文界限。虽然我不知道这个特定例子的用法。 修改由于apply - TableWriter的方法需要RowWriterFactory通过上下文绑定,rfw的目的是用作隐式参数到TableWriter.apply

  

对TableWriter的第一次和第二次调用之间有什么区别?

在不知道第一个电话的参数的情况下,它们是相同的,不是吗?