当前位置: 首页 > 知识库问答 >
问题:

使用多个隐式参数调用主构造函数:从Java调用

戎洛城
2023-03-14

我有一个 Scala 类,它使用 Apache Spark 中的 MR 作业返回输入类型 IN 的最大值。如果我从Scala调用它,这个类工作正常,它的工作原理如下:

// Class
class TypedMax[IN, T](val f: IN => T)(implicit ev$1: T => Ordered[T], ev$2: TypeTag[T])
  extends Aggregator[IN, T, T] {

  override def zero: T = null.asInstanceOf[T]
  override def reduce(b: T, a: IN): T = if (b > f(a)) b else f(a)
  override def merge(b1: T, b2: T): T = if (b1 > b2) b1 else b2
  override def finish(reduction: T): T = reduction
}

// Call function
def max[IN, T](f: IN => T)(implicit ev$1: T => Ordered[T], ev$2: TypeTag[T]): TypedColumn[IN, T] =
    new TypedMax[IN, T](f).toColumn

现在我想让它也可以从java中调用,但是我在传递隐式参数时遇到了一些困难。我知道隐式参数可以通过在Java中将它们追加到参数列表中来传递,但是隐式参数是在Scala中。因此,我正在努力做到以下几点:

class TypedMax[IN, T](val f: IN => T)(implicit ev$1: T => Ordered[T], ev$2: TypeTag[T])
  extends Aggregator[IN, T, T] {

  override def zero: T = null.asInstanceOf[T]
  override def reduce(b: T, a: IN): T = if (b > f(a)) b else f(a)
  override def merge(b1: T, b2: T): T = if (b1 > b2) b1 else b2
  override def finish(reduction: T): T = reduction

  // Java api support
  def this(f: MapFunction[IN, java.lang.Double]) =
    this(x => f.call(x).asInstanceOf[T])(ev$1: T => Ordered[T], ev$2: TypeTag[T])

然后可以从java调用:

public static <T> TypedColumn<T, Double> max(MapFunction<T, Double> f) {
  return new TypedMax<T, Double>(f).toColumn();
}

我尝试了许多从辅助构造函数传入隐式的排列,使用隐式隐式并摆弄逗号和括号。但是,它总是抱怨找不到ev$1和ev$2。但是,我必须传入参数,否则它将出错:

Error:(135, 5) No implicit view available from T => Ordered[T].
    this(x => f.call(x).asInstanceOf[T])
Error:(135, 5) not enough arguments for constructor TypedMax: (implicit ev$1: T => Ordered[T], implicit ev$2: reflect.runtime.universe.TypeTag[T])org.apache.spark.sql.execution.aggregate.TypedMax[IN,T].
Unspecified value parameters ev$1, ev$2.
    this(x => f.call(x).asInstanceOf[T])

如果我尝试:

def this(f: MapFunction[IN, T]) =
  this(x => f.call(x))(T => Ordered[T], TypeTag[T])

结果是:

Error:(135, 38) value Ordered of type scala.math.Ordered.type does not take type parameters.
    this(x => f.call(x))(T => Ordered[T], TypeTag[T])
Error:(135, 50) missing argument list for method apply in object TypeTag
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `apply _` or `apply(_,_)` instead of `apply`.
    this(x => f.call(x))(T => Ordered[T], TypeTag[T])

我错过了什么/误会了什么?谢谢!

共有1个答案

卢作人
2023-03-14

<代码>T=

def this(f: MapFunction[IN, T], e: MapFunction[T, Ordered[T]], tt: TypeTag[T]) =
  this(x => f.call(x))(x => e.call(x), tt)

(我不确定您是否能够从java中具体化一个< code>TypeTag[T])

 类似资料:
  • 问题内容: 我想为MySortedSet调用一个构造函数,该构造函数将Comparator c作为参数。我该如何修改呢? 问题答案: 如果要传递其他捕获的值作为参数,则不能使用方法引用。您将不得不使用lambda表达式来代替: =>

  • 我试图从lambda函数隐式构造一个对象。对象的构造函数将函数指针作为参数。但是代码[1]没有编译消息: 但是标准规定lambda函数可以隐式转换为具有相同参数和返回类型[2]的函数指针。这应该适用于这里,因此我希望构造函数是可调用的。 那么为什么代码不能编译呢?谢谢你的解释! [1]代码示例: https://godbolt.org/g/QE4v1Z [2]C 14标准在第5.1节中规定。2.建

  • 问题内容: 这是面试中提出的问题。如果一个类在Java中何时有多个构造函数,我们可以从另一个构造函数调用另一个函数吗? 问题答案: 可以,我知道的语法是 您还可以通过以下方式调用超类的构造函数 这两个调用只能作为构造函数中的第一条语句完成(因此,您只能在执行其他任何操作之前调用另一个构造函数)。

  • 问题内容: 对不起任何较小的语法错误或其他错误,我正在使用Jitsi模块进行此操作,并且对Java不太熟悉,因此想确认正在发生的事情以及为什么以及如何对其进行修复。 使用按名称加载类方法创建类B的实例时,应用程序正在执行此操作: 在类B中调用重写的load() 初始化变量(根据调试器调用“私有字符串testString = null”),将其无效。 这是预期的Java行为吗?是什么原因造成的?它是

  • 上面写着编译错误 Employee::new、1L、“”、“ 无法解析构造函数。

  • 第二个构造函数应该调用第一个构造函数,但却给了我“递归构造函数调用”错误。 我明白这个错误的意思,只是不明白递归在哪里。第一个contructor将作为参数,而应该是该类型的数组。我错过了什么? 多谢了。