15

私は自分自身の単純な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、この特定のケースでは代わりにスローすることを検討しますが、IMHO の質問は依然として興味深い場合があります。

4

3 に答える 3

25

これは、Tnull 非許容型である可能性があるためです。Tnull許容型であることを強制すると機能します。

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

unwrap(classOf[String]) // compiles

unwrap(classOf[Int]) // does not compile, because Int is not nullable
于 2012-04-08T20:04:10.483 に答える
6

「正しい」解決策は、すぐに失敗する何かをすることです。そのようです:

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

scala 2.10では、これは次のように実装されていました。

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

Predefと呼ばれる新しいメソッドがあるため???です。これが機能するのは、フォームの式が任意の型のサブタイプである type をthrow new Exception持っているためです (型理論のサークルでは、 bottomNothingと呼ばれます)。

これが正しいnull理由は、後で失敗して原因を難読化する可能性のある a を使用するよりも、エラーで即座に失敗する方がはるかに優れているためです。

于 2012-04-08T22:30:52.147 に答える
1

コメントで述べたように、このソリューションは機能しません

私があなたの問題をよく理解していれば、デフォルト値を割り当てることもできます。詳細については、scala のフィールドに "_" を割り当てるとはどういう意味ですか? . 詳細については、 Scala 言語仕様の4.2 変数の宣言と定義を参照してください。

したがって、次のように簡単に実行できます。

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

タイプの不一致なしで設定されunwrapます。null

于 2012-04-08T21:09:11.923 に答える