如何从Scala中的一个通用函数返回null?(How to return null from a

2019-07-28 21:03发布

我写我自己的简单javax.sql.DataSource的实现,它的我需要工作的唯一方法是getConnection: Connection ,但接口继承了许多其他的方法(我不需要)从javax.sql.CommonDataSourcejava.sql.Wrapper 。 所以,我想“落实”那些不需要的方法方式,他们不会真的工作,但调用时会表现得适当的方式。 例如我实现boolean isWrapperFor(Class<?> iface)作为

def isWrapperFor(iface: Class[_]): Boolean = false

我想实现<T> T unwrap(Class<T> iface)作为

def unwrap[T](iface: Class[T]): T = null

但最后不工作:编译报告类型不匹配。

这将是正确的使用null.asInstanceOf[T]还是有更好的办法? 当然,我认为只是抛出UnsupportedOperationException相反在这种特殊情况下,但恕我直言问题仍然会很有意思。

Answer 1:

这是因为T可能是一个非空的类型。 它的工作原理,当你执行T是一个可空类型:

def unwrap[T >: Null](iface: Class[T]): T = null

unwrap(classOf[String]) // compiles

unwrap(classOf[Int]) // does not compile, because Int is not nullable


Answer 2:

“正确”的解决办法是做一些事情,这将立即失败。 像这样:

def unwrap[T](iface: Class[T]): T = sys.error("unimplemented")

在斯卡拉2.10,这将是实现:

def unwrap[T](iface: Class[T]): T = ???

因为在一个新的方法Predef称为??? 。 此工作,因为该形式的表达式throw new Exception的类型是Nothing ,这是任何类型的子类型(它被称为在类型理论界底部 )。

究其原因,这是正确的,这是更好的与错误立即失败,而不是使用null以后可能会失败,并混淆的原因。



Answer 3:

正如评论所说,该解决方案不起作用

如果我理解你的问题好了,你也可以指定默认值,在细节解释这是什么意思分配“_”在Scala中的一个字段? 。 您可以在4.2变量声明和定义找到更多的相关信息Scala语言规范

因此,你可以简单地做:

def unwrap[T](iface: Class[T]): T = _

将设置unwrapnull没有类型不匹配。



文章来源: How to return null from a generic function in Scala?