[Scala]Отфильтровать объекты по типу
От: Akcelisto  
Дата: 15.06.08 11:11
Оценка:
package test

import scala.collection.mutable.ArrayBuffer

class Thing
class GoodThing extends Thing
class BadThing extends Thing

object IsInstanceOfTest extends Application{
  
  val buffer=new ArrayBuffer[Thing]
  buffer += new BadThing
  buffer += new GoodThing
  buffer += new GoodThing
  
  def filterThing[T<:Thing]=buffer.filter(_.isInstanceOf[T])
  
  def filterThing(typeName:String)=buffer.filter(_.getClass.getSimpleName==typeName)
  
  println(filterThing[GoodThing])
  println(filterThing("GoodThing"))
}


Вывод программы:

ArrayBuffer(test.BadThing@10ef90c, test.GoodThing@3ee284, test.GoodThing@8965fb)
ArrayBuffer(test.GoodThing@3ee284, test.GoodThing@8965fb)


Почему filterThing[T<:Thing] не срабатывает правильно? Как написать правильно? Нужно, чтобы работало как filterThing(typeName:String)
Re: [Scala]Отфильтровать объекты по типу
От: Cyberax Марс  
Дата: 16.06.08 03:40
Оценка:
Здравствуйте, Akcelisto, Вы писали:

A>Почему filterThing[T<:Thing] не срабатывает правильно? Как написать правильно? Нужно, чтобы работало как filterThing(typeName:String)

Потому, что Scala использует Type Erasure, как и Java. Констрейнты используются только на этапе компиляции. Пофиксить можно явным использованием типа Class.
Sapienti sat!
Re[2]: [Scala]Отфильтровать объекты по типу
От: Akcelisto  
Дата: 16.06.08 15:24
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Потому, что Scala использует Type Erasure, как и Java. Констрейнты используются только на этапе компиляции. Пофиксить можно явным использованием типа Class.


Я думал раз parameter type в Scala реализован лучше, то может так можно написать. Эх, надеюсь в java 7 сделают reified generic, это было бы самое полезное нововедение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.