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
}

它工作得很好,但问题是如果我不提供显式类型,编译器会选择Nullfor T,当然它不起作用:

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

print(lookup);

打印Null,当然什么也没找到。很明显,编译器推断出尽可能少的泛型类型。

如果我添加一个显式类型

print(lookup[String]);

它工作正常。但这容易出错。我想:

  1. 让编译器始终选择最通用的类​​型,而不是最不通用的类型。所以print(lookup)最通用的可能类型是String,所以我希望编译器推断String. T或者
  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 回答