У меня есть следующий, где я поставил информацию и экстракторы для различных схем данных:Scala: как просмотреть методы подкласса с конкретизацией
trait DataScheme {
type Type <: List[Any]
class ExtractorMethods(ticker: String, dataList: List[Type]) {
def getDatetime(datum: Type): Date = new Date(datum(columnIndex(Names.datetime)).toString)
def upperDatum(date: Date): Type = dataList.minBy(datum => getDatetime(datum) >= date)
def lowerDatum(date: Date): Type = dataList.maxBy(datum => getDatetime(datum) <= date)
}
}
trait IndexScheme extends DataScheme {
type Type = (Date, Double, Double, Double, Double, Long)
class ExtractorMethods(ticker: String, dataList: List[Type]) extends super.ExtractorMethods(ticker: String, dataList: List[Type]){
def testing12(int: Int):Int = 12
val test123 = 123
}
}
Я хочу что-нибудь расширение DataScheme использовать свою ExtractorMethods методу (например, lowerDatum), но также имеют свои собственные методы (например, тестирование12).
Существует определение класса для списков элементов данных:
class Data[+T <: DataScheme](val ticker: String, val dataList: List[T#Type], val isSorted: Boolean)
(implicit m: Manifest[T], mm: Manifest[T#Type]) extends Symbols {
def this(ticker: String, dataList: List[T#Type])(implicit m: Manifest[T], mm: Manifest[T#Type]) = this(ticker, dataList, false)(m: Manifest[T], mm: Manifest[T#Type])
val dataScheme: T
val extractorMethods = new dataScheme.ExtractorMethods(ticker, dataList.asInstanceOf[List[dataScheme.Type]])
}
класса А Данные должны сделать доступными методы в ExtractorMethods схемы, так что они могут быть использованы в основной программе через экземпляр данных, которые была определена. Например, если sortedData является экземпляром данных [IndexScheme], следующие работы:
val lowerDatum = sortedData.extractorMethods.lowerDatum(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2010-03-31 00:00:00"))
, но это не делает:
val testing = sortedData.extractorMethods.testing12(123)
, потому что «тестирование 123 не является членом sortedData.dataScheme.extractorMethods ». Поэтому мой вопрос в том, как можно сделать доступными подклассы ExtractorMethods в подзаголовках DataScheme, таких как IndexScheme? Как это возможно с помощью Manifests и TypeTags? Благодарю.
ExtractorMethods - отличное название для этого класса. Вероятно, это будет источником первоначальной путаницы для всех, кто должен прочитать ваш код, учитывая, что ** extractor ** - такой известный термин в Scala. – itsbruce
Кстати, как это даже скомпилировать? Вы не должны переопределять тип Type: List [Any] 'с типом Type = (Date, Double, Double, Double, Double, Long)'. Кортежи не являются подтипом 'List [Any]'. Какую версию Scala вы используете? – itsbruce
Кроме того, как класс Data компилируется, когда он кажется абстрактным? Хотя у вас нет абстрактного ключевого слова. ** dataScheme ** val, кажется, не создается, что вынуждает класс быть абстрактным. Вы действительно скомпилировали этот код? Имеет ли ** dataScheme ** val какие-либо цели, кроме как предоставить правильную версию метода ExtractorMethods? – itsbruce