gpt4 book ai didi

java - 使用 java generic 从 java 调用重载的 scala case apply

转载 作者:行者123 更新时间:2023-11-30 03:25:20 25 4
gpt4 key购买 nike

我需要用Java编写几个方法,大部分系统都是用scala编写的。除了一种情况外,互操作并不是什么大问题。

我有一个java方法,它在调用方法时采用泛型T,传入的泛型实际上是一个scala案例类。我面临的挑战是从 java 代码中调用案例类的重载 apply 方法。它无法解决应用的方法。我已经尝试了 T 的扩展定义的几种变体,但似乎都没有解决问题。

有什么建议吗?这是迄今为止代码的简化版本:

Java(有问题的方法)

public <T> Option<T> getResult(String name) {
Iterator<Item> items = repo.results(name).iterator();

if (items.hasNext()) {
T model = T.apply(items.next()); // ?? how to call overloaded case class apply method
return new Some<>(model);
}

return scala.Option$.MODULE$.apply(null);
}

Scala 案例类(具有重载的 apply 方法),许多可能的案例类之一。

case class Person (id: Int, name: String)

object Person {
def apply(item: Item) = toObject(item)

def toObject(item: Item): Person = {
Person(
item.getProperty[Int]("id"),
item.getProperty("name")
)
}
}

最佳答案

您的代码中有两个问题:

  1. Java 泛型会在运行时被删除,因此为了执行类似 T.apply 的操作,您需要一个 T 的实例,所以你的方法看起来像:

    public <T> Option<T> getResult(String name, T t)

  2. 您需要一个上限,其中 apply方法将被定义以确保您可以在 T 上调用该方法。 。然而,scala 在伴生对象中声明了 this,该伴生对象是与其所伴随的类不同的一个类。并且没有用于描述哪个apply的伴生对象的父类(super class)。他们应该实现的方法。

我唯一能想到的是,如果你知道 apply方法仅需要 1 个参数:

public <T> Option<T> getResult(String name, Function1<Item, T> companion){ // this is extended by companion objects of case class that take only 1 parameter
...
T model = companion.apply(items.next());
...
}

使用这种方法,您可以像这样调用该方法:

 getResult("name", Person$.MODULE$)  //pass the companion object as a factory 

关于java - 使用 java generic 从 java 调用重载的 scala case apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30374504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com