2013-08-28 18 views
6

Scalaコンパイラには、実行時にnullポインタの逆参照があるかどうかを確認するための-Xcheck-nullがあります。常にnull以外の結果を返すメソッド呼び出しを呼び出す結果

それは私のために大丈夫だが、私はあまりにも多くの偽陽性を得る、すなわち、私はロガー定義するとします。

private final val LOGGER: Logger = LoggerFactory.getLogger(classOf[GenericRestImpl]) 

nullを返すことはありませんgetLogger方法を。どのように私はコンパイラにこの知識を渡すことができますので、それは不平を言いませんか?

[WARNING] TestImpl.scala:31: warning: potential null pointer dereference: LOGGER.debug 
[WARNING]  LOGGER.debug("Using {} for sort", sortParam) 

私は新しいインスタンスを作成し、私はNotNull特性とそれをマークすることができます。okです

return new Foo() with NotNull. 

が、何他のメソッドから返さオブジェクトを行うには?特にサードパーティ製のライブラリから来ているのですか?あまりにも多くのオーバーヘッドを追加するので、私はすべての変数をオプションとしてマークするのは好きではありません。また、私は暗黙の変換を作成するのは嫌いです(NotNullとしてマークしたいクラスごとに余分なクラスが必要になるため)

私はLibrary support for Scala's NotNull traitの質問もチェックしましたが、私の問題を解決できませんでした。あなたが何かをタグ付けするNotNullを使用できるように

+0

あなたは正しく理解していますが、NotNull形質は単なるマーカーです。それ以上は何もしません。 – Jatin

答えて

5

Jatinは述べているように、NotNullは、単にマーカーまたはタグである。これを行うにはトリックがキャストあなたの基本型with NotNullを強制的にである。

だからあなたのような何かを書くことができますこの"notnull".asInstanceOf[String with NotNull]。決してそれが決してnullでないと確信しているなら、それは安全なキャストです。

あなたの実際の例では、あなたがそれゆえ書くことができます。このため、新しいタイプを作成する必要はありませんが

private final val LOGGER: Logger with NotNull = 
    LoggerFactory.getLogger(classOf[GenericRestImpl]).asInstanceOf[Logger with NotNull] 

を、あなたはそれをたくさんしなければならない場合、それは少し面倒ですので、あなたには、いくつかを使用することができます表記を明らかにする/簡素化する少しutilsの:

type NeverNull[T] = T with NotNull 
def neverNull[A](a: A): NeverNull[A] = a.asInstanceOf[A with NotNull] 

NeverNullNotNullneverNullでタグ付けされた任意のタイプTためだけエイリアスがヌル決してあるとしてタイプAの既存の値をタグ付けするほとんどのラッパーです。

implicit def neverNull[A](a: A): NeverNull[A] = a.asInstanceOf[A with NotNull] 

private final val LOGGER: NeverNull[Logger] = LoggerFactory.getLogger(classOf[GenericRestImpl]) 

NeverNull[Logger]ことはまだある:あなたが何をしているのは本当に確信している場合

private final val LOGGER: NeverNull[Logger] = neverNull { 
     LoggerFactory.getLogger(classOf[GenericRestImpl]) 
} 

あなたも、この暗黙の型変換を行うことができます

それからとして使用することができますLoggerであるため、そのクラスの任意のメソッドを呼び出すか、パラメータとしてLoggerをとる関数に渡すことができます。

コンストラクトのこの種のは、他のアプリケーションとの議論herehereを参照してください、アンボクシングタグ付けタイプと呼ばれ、かなり有用です。

関連する問題