Преобразование объекта типа Any в myClass, передавая myClass в качестве параметра - PullRequest
1 голос
/ 25 июня 2019

Итак, у меня есть класс:

case class Document (idx: String, name: String, code: String)

Из-за некоторых преобразований объект, который изначально был создан как Document, теперь становится типа Any.

val doc = Document("12", "anyName", "ps") // Ends up as type Any

Итак, я хочучтобы снова преобразовать его в тип Document.

Я знаю, что это можно сделать так:

val docNew = doc.asInstanceOf[Document]

Но в данном случае я пытаюсь передать тип, Document, в качестве параметра, чтобы сделать его более общим.

Итак, я пробовал следующее:

val mType = Document
val docNew = doc.asInstanceOf[mType]

Но Intellij говорит:

Не удается разрешить символmType

Редактировать: Моя конечная цель - передать параметр Document в функцию, чтобы в конце я мог сделать что-то вроде:

def convertIntoDoc(doc: Any, mType: Type) = {
    val docNew = doc.asInstanceOf[mType]
    docNew
}

Ответы [ 3 ]

5 голосов
/ 25 июня 2019

Если вы хотите научиться программировать с помощью Scala, вы должны узнать о разнице между типами и значениями .

Из-за параметров типа стирания типа никогда не бываетсделать это в вашей программе.В действительности, типы существуют только для того, чтобы помочь вам написать хороший код.

Если вы пойдете по этому пути, вы в конечном итоге поймете, что asInstanceOf[T] на самом деле не делает ничего .

Вы можете подумать, что это странно, и с помощью стирания типов система типов является излишней, но позвольте мне заверить вас, что она совершенно полезна, а когда дело доходит до более сложного кода, на самом деле становится трамплином для общего программирования ,например, код, который может использоваться многими различными способами из-за параметризации типа.

Чтобы развернуть это немного дальше, вы почти никогда не должны получить val типа Any, потому что вы потеряете эту дополнительную безопасность.сеть статической типизации.Это означает, что вы уже допустили ошибку где-то вверх по течению в своем коде.

Ваша конечная цель проста в достижении:

def convertIntoDoc[MType](doc: Any) = {
    val docNew = doc.asInstanceOf[MType]
    docNew
}

Вы просто должны помнить, что MType является типом ине переменная.Поэтому его следует использовать как параметр типа, а не как параметр значения.

Проблема в том, что приведение Any в MType даст вам ClassCastException с (при запуске вашей программы!), Есливы используете неправильный тип.

asInstanceOf очень опасен, потому что он перезаписывает безопасность типов, которую обеспечивает компилятор Scala.

Если у вас есть какие-либо вопросы по этому поводу, дайте мне знать.

2 голосов
/ 25 июня 2019

Правильный способ конвертировать Any в Document - использовать match:

val docNew = doc match { case d: Document => d }

Это безопасно, потому что оно выдаст MatchException, если по какой-то причине объектне относится к типу Document.

Ваша функция convertIntoDoc является просто оболочкой для asInstanceOf, поэтому вам нужно более подробно рассказать о том, что эта функция предназначена (желательно в отдельном вопросе).

0 голосов
/ 25 июня 2019

вместо val вы можете использовать type

type mType = Document
val docNew = doc.asInstanceOf[mType]

Во второй части вопроса вы можете передать тип, используя параметр типа в качестве аргумента

def convertIntoDoc[A](doc: Any) = {
    val docNew = doc.asInstanceOf[A]
    docNew
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...