将特定对象投射到另一个对象

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

明智的做法是设置一个继承结构,因此PatientFileDoctorFile 都从具有相关属性的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

【讨论】:

以上是关于将特定对象投射到另一个对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Unity 中沿光线投射实例化预定义数量的对象

将一组指针投射到其他对象?

将 activeX 对象投射到我的对象上的问题

将对象投射到 T

我如何添加光线投射统一命中的对象并将它们添加到列表中

如何将对象投射到桌子上?