我正在编写一个扩展 Java 类的 Scala 类。我必须扩展这个抽象 Java 类,因为它包含一些转换器,并且我需要编写我自己的转换器,我可以插入到他们的框架中。所以下面方法的签名是强加给我的:当我说我的类扩展了它们的抽象类时,它是由 Eclipse 自动生成的。如果我尝试修改方法签名,则该类无法编译,因为“它没有实现父级的抽象方法”。
方法的实现当然是我的选择——但我发现我无法满足类型系统的约束。
我需要做一些非常简单的事情:将“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]
}
我怎样才能实现这个方法?