trait LowPriorityOrderingImplicits {
implicit def ordered[A <: Ordered[A]]: Ordering[A] = new Ordering[A] {
def compare(x: A, y: A) = x.compare(y)
}
}
上面的代码是做什么的?
此外,对于此代码(取自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
}
答案 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的第一次和第二次调用之间有什么区别?
在不知道第一个电话的参数的情况下,它们是相同的,不是吗?