2

特定のクラスのインスタンスのストレージを検索するメソッドがあります。

def lookup[T >: Null: ClassTag]: T = {
  // Print what class tag we got:
  System.out.println(implicitly[ClassTag[T]].toString);
  null; // details omitted, just return null
}

それはうまく機能しますが、問題は、明示的な型を指定しないと、コンパイラが for を選択NullT、もちろん機能しないことです。

def print(msg: String) = { /* ... */ }

print(lookup);

印刷Nullされ、もちろん何も見つかりません。明らかに、コンパイラは可能な限りジェネリック性の低い型を推論します。

次のような明示的なタイプを追加すると

print(lookup[String]);

それは正常に動作します。しかし、これは非常にエラーが発生しやすいです。次のいずれかを行います。

  1. コンパイラが、可能な限り一般的でない型ではなく、可能な限り最も一般的な型を常に選択するようにします。したがってprint(lookup)、最も一般的な可能な型はであるため、コンパイラに を推論さStringせたいと思います。またはStringT
  2. 何らかの形で明示的な型が常に存在するように強制し、print(lookup).

これは可能ですか?

4

1 に答える 1

3

1) 最も一般的なタイプはAnyRefです。

2)この回答=!=から使用できます:

scala> def lookup[T >: Null: ClassTag](implicit guard: T =!= Null ): T = {
     |   null; // details omitted, just return null
     | }
lookup: [T >: Null](implicit evidence$1: scala.reflect.ClassTag[T], implicit guard: =!=[T,Null])T

scala> lookup
<console>:11: error: ambiguous implicit values:
 both method equal in trait LowerPriorityImplicits of type [A]=> =!=[A,A]
 and method nequal in object =!= of type [A, B](implicit same: =:=[A,B])=!=[A,B]
 match expected type =!=[Null,Null]
              lookup
              ^

scala> lookup[String]
res3: String = null
于 2013-05-07T18:09:56.663 に答える