【发布时间】:2015-05-22 15:53:52
【问题描述】:
我需要用 Java 编写几种方法,大部分系统都是在 scala 中编写的。除了一种情况外,互操作不是什么大问题。
我有一个 java 方法,它在对方法的调用中采用泛型 T,传入的泛型实际上是一个 scala 案例类。我面临的挑战是从 Java 代码中调用案例类的重载应用方法。它无法解决方法应用。我已经尝试了 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")
)
}
}
【问题讨论】:
-
你需要一个
Person的实例并且你必须向上绑定类型参数。 -
是
T应该是任何情况类或总是Person(在这种情况下你不需要泛型) -
@kocko 我尝试了
public <T extends Person> Option<T> getResult(String name),但有问题的行上的错误是Required T but found Person。另外,我不想使用 Person,因为可以传入许多案例类类型。如果我为它们使用基类,我无法在 scala 中为基类伴随对象定义抽象应用方法。我错过了什么,你能提供示例代码吗?谢谢。 -
@Chirlo 可以有很多案例类类型,所以需要泛型。如果我删除泛型并只使用 Person 的类型化参数,它就可以正常工作。
标签: java scala generics interop