将特定对象投射到另一个对象
Posted
技术标签:
【中文标题】将特定对象投射到另一个对象【英文标题】:Cast a specific object to another 【发布时间】:2021-12-21 22:28:30 【问题描述】:我正在尝试将一个对象转换为另一个对象,它们是相同的(相同的属性),但我一直认为我无法进行此转换。 我有这两个对象,以及一个使用 PatientFile 作为主要对象的适配器,但我也想将 i 用于 DoctorFile,因为它是同一个对象,但是当我尝试投射它时,它只是一直显示投射无法成功。
所以我的问题是如何将对象 DoctorFile 转换为相同对象的 PatientFile 并在我的适配器中将其用作列表。如果你问我不能只创建一个对象,因为这两个对象是从改造的请愿书中收到的。
对象 1:
data class DoctorFiles(
val file: String,
val id: String,
val name: String
): Serializable
对象 2:
data class PatientFiles(
val file: String,
val id: String,
val name: String
): Serializable
适配器:
class ConsultationDocumentsAdapter(private val onDownload: (PatientFilesId)->Unit):RecyclerView.Adapter<ConsultationDocumentsHolder>()
private var list: List<PatientFilesId> = listOf()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ConsultationDocumentsHolder
val inflater = LayoutInflater.from(parent.context)
return ConsultationDocumentsHolder(inflater, parent, onDownload)
override fun onBindViewHolder(holder: ConsultationDocumentsHolder, position: Int)
holder.bind(list[position])
override fun getItemCount(): Int = list.size
fun loadItems(documents: List<PatientFilesId>)
list = documents
notifyDataSetChanged()
class ConsultationDocumentsHolder(
inflater: LayoutInflater,
parent: ViewGroup,
private val onDownload: (PatientFilesId) -> Unit
) :
RecyclerView.ViewHolder(inflater.inflate(R.layout.cell_consultation_documents,
parent, false))
private lateinit var documentName: TeladocTextView
private lateinit var documentSize: TeladocTextView
private lateinit var documentDownload: AppCompatImageView
fun bind(document: PatientFilesId)
setupUi()
loadConsultationDocumentData(document)
private fun setupUi()
documentName = itemView.findViewById(R.id.consultation_document_name)
documentSize = itemView.findViewById(R.id.consultation_document_size)
documentDownload = itemView.findViewById(R.id.consultation_document_download)
private fun loadConsultationDocumentData(document: PatientFilesId)
documentName.text = document.name
val size = "" + TeladocUtils.sizeOfFile(document.file) / 1024
documentSize.text = size + "Mb"
documentDownload.setOnClickListener
onDownload(document)
【问题讨论】:
你需要了解铸造逻辑。您只能转换具有“家庭”层次结构的对象。意思是,您可以将对象 B 转换为 A,当且仅当对象 B 继承 A。如果您有对象 C 继承对象 B,您可以将对象 C 转换为对象 B 或 A。如果您有对象 D 也继承 A,您可以将 D 转换为 A,不能将 D 转换为 B 或 C。为了能够使用这两种类型的对象,您需要创建 1 个父类/接口,它们都继承自并更改您的适配器以使其工作与父类型对象 【参考方案1】:恐怕你不能施放它们。即使它们具有相同的属性,DoctorFile
也不是 PatientFile
。
明智的做法是设置一个继承结构,因此PatientFile
和DoctorFile
都从具有相关属性的File
继承,或者只是将这些属性复制到一个新对象中。
【讨论】:
【参考方案2】:除非这些类继承自同一个超类,否则您不能强制转换不同的类型。
我会推荐一个抽象的非数据库类:
abstract class CommonFile: Serializable
abstract val file: String
abstract val id: String
abstract val name: String
并从超类继承数据类。
data class DoctorFiles (
override val file: String,
override val id: String,
override val name: String
): CommonFile()
data class PatientFiles (
override val file: String,
override val id: String,
override val name: String
): CommonFile()
用法:
val doctorsFile = DoctorFiles("1", "1", "Jane Doe")
// cast to super-class
val commonFile = doctorsFile as CommonFile
// Check which data class
when (commonFile)
is DoctorFiles -> print("This is a DoctorFiles")
is PatientFiles -> print("This is a PatientFiles")
// Cast multiple data classes
val doctorsFile = DoctorFiles("1", "1", "Jane Doe")
val patientsFile = PatientsFile("2", "2", "Joe Blow")
val list = listOf<CommonFile>(doctorsFile, patientsFile)
【讨论】:
【参考方案3】:如果你想将DoctorFile
转换(不能在此处转换)PatientFile
,你可以为此创建一个简单的扩展函数。
fun DoctorFile.toPatientFile() = PatientFile(file, id, name)
【讨论】:
【参考方案4】:你可以试试
list.map it->PatientFiles(it.file,it.id,it.name)
【讨论】:
【参考方案5】:这是我知道你可以用来在 koltin 中转换为对象的一种方法
val patientFiles = PatientFiles()
val doctorFiles = DoctorFiles()
patientFiles.file = doctorFiled.file
doctoreFiles.name = patientFiles.name
【讨论】:
以上是关于将特定对象投射到另一个对象的主要内容,如果未能解决你的问题,请参考以下文章