我正在编写一个扩展Java类的Scala类。我必须继承这个抽象Java类,因为它包含一些转换器,并且我需要编写自己的转换器,以便将其插入到他们的框架中。因此,下面的方法签名被强制执行:当我说我的类扩展了他们的抽象类时,Eclipse会自动生成它。如果我尝试修改方法签名,则类无法编译,因为“它没有实现来自父类的抽象方法”。
当然,方法的实现是我自己选择的 - 但我发现我无法满足类型系统的约束条件。
我需要做一些非常简单的事情:将“None”视为null,并返回其他任何值。但我发现我无法以类型安全的方式做到这一点。如果我像下面显示的代码一样编写代码,我会收到警告,指出“未检查的抽象类型T,因为它被消除了”。我该如何消除这种警告?
我也想知道一旦擦除应用于它,即第二个“if”条件会是什么样子。
直观地讲,我明白当输入为Any时我不能保证返回一个T - 这就是为什么编译器不高兴的原因。实际上,这将起作用,因为我们只是读取字符串并返回字符串 - 但方法签名是由继承声明强制执行的。
当然,方法的实现是我自己选择的 - 但我发现我无法满足类型系统的约束条件。
我需要做一些非常简单的事情:将“None”视为null,并返回其他任何值。但我发现我无法以类型安全的方式做到这一点。如果我像下面显示的代码一样编写代码,我会收到警告,指出“未检查的抽象类型T,因为它被消除了”。我该如何消除这种警告?
我也想知道一旦擦除应用于它,即第二个“if”条件会是什么样子。
直观地讲,我明白当输入为Any时我不能保证返回一个T - 这就是为什么编译器不高兴的原因。实际上,这将起作用,因为我们只是读取字符串并返回字符串 - 但方法签名是由继承声明强制执行的。
def execute[T](value: Any): T = {
if (value == null || value == "None") null.asInstanceOf[T]
// Warning: abstract type T is unchecked since it is eliminated by erasure
else if (value.isInstanceOf[T]) value.asInstanceOf[T]
// warning here: ^
else null.asInstanceOf[T]
}
我该如何实现这个方法?