我有某处定义了一个通用可变我的控制以外一些遗留Java代码(即我不能改变其类型):混合Scala和Java:如何获得一般类型的构造函数参数?
// Java code
Wrapper<? extends SomeBaseType> payload = ...
我接收这种值作为方法参数在我的代码中,并希望将它传递给Scala case class
(用作具有actor系统的消息),但是不要正确定义这些定义,以至于我至少得不到编译器警告。
// still Java code
ScalaMessage msg = new ScalaMessage(payload);
这给出了一个编译器警告 “类型安全:构造器...属于原始类型......”
斯卡拉case class
被定义为:
// Scala code
case class ScalaMessage[T <: SomeBaseType](payload: Wrapper[T])
我如何定义代码编写干净的代码类? (不幸的是,改变了Java Wrapper
类的代码或参数的类型不是一个选项)
更新澄清有效载荷参数
的原点加为了比较,在Java中我可以以同样的方式定义参数作为变量定义:
// Java code
void doSomethingWith(Wrapper<? extends SomeBaseType> payload) {}
,并调用它艾科rdingly
// Java code
doSomethingWith(payload)
但我不能实例化例如一个Wrapper对象直接没有得到“原始类型”警告。在这里,我需要使用static
helper方法:
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);
解决方案
我可以添加一个类似的helper方法到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
类W/O问题:
// Java code
ScalaMessage msg = ScalaMessageHelper.apply(payload);
除非有人想出了一个更好的解决方案,我将提取这是一个答案......
谢谢!
不会工作,因为我实际上有一个类型为'Wrapper <?的方法参数?扩展了Java中的SomeBaseType>,它传入我们正在讨论的代码块中。我会相应更新原始问题。 –
我做了一个更新,检查它。 –