我写我自己的简单javax.sql.DataSource
的实现,它的我需要工作的唯一方法是getConnection: Connection
,但接口继承了许多其他的方法(我不需要)从javax.sql.CommonDataSource
和java.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
相反在这种特殊情况下,但恕我直言问题仍然会很有意思。
这是因为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
“正确”的解决办法是做一些事情,这将立即失败。 像这样:
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
以后可能会失败,并混淆的原因。
正如评论所说,该解决方案不起作用
如果我理解你的问题好了,你也可以指定默认值,在细节解释这是什么意思分配“_”在Scala中的一个字段? 。 您可以在4.2变量声明和的定义找到更多的相关信息Scala语言规范
因此,你可以简单地做:
def unwrap[T](iface: Class[T]): T = _
将设置unwrap
与null
没有类型不匹配。