2013-10-29 18 views
5

I yansıtıcı olan bağımsız değişken ya da value class bir örneği olabilir de olmayabilir de bir yöntem yürütmesini ediyorum. Değer sınıflarının amacı altta yatan değerin boks edilmesini önlemek olduğundan, eğer parametre tipi değer sınıfı ise, o zaman söz konusu yöntem aslında kutudan çıkarılmış değer bekleyecektir. Bu durumu ele almak için temel değeri değer sınıfından ayırmaya çalışıyorum. İlk argüman bir değer sınıfının olup olmadığını belirlemek gerekiyor ve burada ilk engeli çarptı:Scala: değeri sınıflarının tanıyan nesneleri

case class NonValueClass(underlying: Int) 
: beklendiği gibi yöntem için true döndürür olarak

def isObjectOfValueClass(arg: Any) = 
    classOf[AnyVal].isAssignableFrom(arg.getClass) 

Bu işe yaramazsa,

nasıl isObjectOfValueClass uygulanabilir? Ya da argüman olarak bir değer sınıfının nesnesini çekebilecek bir yöntemi yansıtmak için daha basit bir yol var mı?

+1

, değer sınıfı sadece ilkeller sarmak değil, aynı zamanda nesneler içerebilir. –

cevap

3

Önce, isObjectOfValueClass değeriniz sınıf örneklerinin bir kutulu sürümü almak unutmayın. İstediğiniz gibi

İkincisi, çalışamaz. Çünkü classOf[AnyVal] == classOf[AnyRef] == <java.lang.Object>.

Orada .instanceOf[T], AnyVal desen eşleştirme veya .instanceOf[T] ait parametre olarak kullanılamaz sahip olmayan bir kutulu değer sınıfı ve bir referans sınıfı (Any ayırt etmek hiçbir çalışma zamanı yoludur ve ne en önemli, derlenmiş değer sınıfları yok AnyVal'u uzatın veya uygulayın. Eğer derleme zamanında karar istiyorsanız

sonra deneyin:

case class IsAnyVal[-T](val value: Boolean) extends AnyVal 
implicit def _noClueHowToNameThisImplicit_1 = IsAnyVal[AnyVal](true) 
implicit def _noClueHowToNameThisImplicit_2 = IsAnyVal[AnyRef](false) 
def isAnyVal[T](arg: T)(implicit ev: IsAnyVal[T]) = ev.value 

scala> isAnyVal(1) 
res4: Boolean = true 

scala> isAnyVal("") 
res5: Boolean = false 

seni daha kazara boks olmadan tespit kutulu değer sınıfı örneklerinin tek alanını ayıklamak istiyorum nasıl emin değilim. Ayrıca, Hotspot küçük kısa ömürlü nesneleri optimize etmede oldukça iyidir. Bu arada