我有一些遗留的 Java 代码在我无法控制的某个地方定义了一个通用payload
变量(即我无法更改它的类型):
// Java code
Wrapper<? extends SomeBaseType> payload = ...
我在我的代码中接收到这样一个payload
值作为方法参数,并希望将其传递给 Scala case class
(用作演员系统的消息),但没有正确定义,以至于我至少没有收到编译器警告.
// still Java code
ScalaMessage msg = new ScalaMessage(payload);
这给出了编译器警告“类型安全:构造函数......属于原始类型......”
Scalacase class
定义为:
// Scala code
case class ScalaMessage[T <: SomeBaseType](payload: Wrapper[T])
如何定义案例类以使代码编译干净?(遗憾的是,更改 JavaWrapper
类的代码或payload
参数的类型不是一种选择)
更新以阐明有效载荷参数的来源
添加为了比较,在Java中我可以定义一个参数,就像payload
定义变量一样:
// Java code
void doSomethingWith(Wrapper<? extends SomeBaseType> payload) {}
并相应地调用它
// Java code
doSomethingWith(payload)
但是我不能在没有得到“原始类型”警告的情况下直接实例化一个 Wrapper 对象。在这里,我需要使用一个static
辅助方法:
static <T> Wrapper<T> of(T value) {
return new Wrapper<T>(value);
}
并使用这个静态助手来实例化一个Wrapper
对象:
// Java code
MyDerivedType value = ... // constructed elsewhere, actual type is not known!
Wrapper<? extends SomeBaseType> payload = Wrapper.of(value);
解决方案
我可以向 Scala 伴生对象添加一个类似的辅助方法:
// Scala code
object ScalaMessageHelper {
def apply[T <: SomeBaseType](payload: Wrapper[T]) =
new ScalaMessage(payload)
}
object ScalaMessageHelper2 {
def apply[T <: SomeBaseType](payload: Wrapper[T]) =
ScalaMessage(payload) // uses implicit apply() method of case class
}
并从 Java 中使用它来实例化没有ScalaMessage
问题的类:
// Java code
ScalaMessage msg = ScalaMessageHelper.apply(payload);
除非有人想出一个更优雅的解决方案,否则我会提取这个作为答案......
谢谢!