我有以下函式,它應該從一個資料類映射到另一個資料類,但它沒有作業:
我有以下函式,它應該從一個資料類映射到另一個資料類,但它沒有作業。
private fun ClassA。 toClassB()=ClassB(
text = 文本。
meta = meta,
訊息 = 訊息)
ClassB的下劃線是紅色的,錯誤是下面的函式不能用提供的引數呼叫。
然而,僅僅映射屬性text就可以正常作業:
private fun ClassA. toClassB()=ClassB(
text = 文本)
所以我猜測上面的代碼不作業,因為列舉屬性。
ClassA和ClassB看起來完全一樣,就像這樣:
ClassA和ClassB看起來完全一樣。
data class ClassB(
@JsonProperty("text")(
val text: 字串。
@JsonProperty("meta"/span>)
val meta: 元?。
@JsonProperty("message"/span>)
val message: 訊息?
) {
constructor(text: String) : this(
text = text,
meta = null,
message = null,
)
enum class Meta{
一、二、三
}
enum class Message { one, two, three }
一,二
}}
那么我如何映射使用列舉屬性的資料類呢?
uj5u.com熱心網友回復:
你的錯誤
"ClassA和ClassB看起來完全一樣" -> 這導致了 "重復的 "列舉:Meta & Message同時存在于ClassA 和 ClassB<
這導致了以下錯誤:
這導致了以下錯誤。
private fun ClassA. toClassB() = ClassB(
text = text, // ok = ClassB(
meta = meta, //預期。ClassB.Meta, provided: ClassA.Meta
message = 訊息 //預期。ClassB.Message, provided: ClassA.Message
)
你現在有兩個選擇:
你只需要一個列舉
。你實際上只需要一個列舉
。- 將一個移到頂層的某個地方 。
- 洗掉另一個
- 確保你修正了你的匯入 。
你實際上需要兩個不同的列舉。
例如:
// ClassA
enum class Meta {
一、二、三
}
//ClassB
enum class Meta {
UNO, DOS, TRES
}
那么我建議你創建一個函式,如:
private fun ClassA. Meta.toClassBMeta() =
when(this){
ClassA.Meta.ONE -> ClassB.Meta.UNO,
ClassA.Meta.TWO -> ClassB.Meta.DOS。
ClassA.Meta.THREE -> ClassB.Meta.TRES。
}
在你的映射器中使用它:
private fun ClassA. toClassB()=ClassB(
text = 文本。
meta = meta.toClassBMeta(),
message = message.toClassBMessage())
uj5u.com熱心網友回復:
我認為你的問題在于你定義列舉的方式。在你的代碼片段中,你似乎在ClassB的范圍內定義了它們。你說ClassA和ClassB的內容是相同的,所以我認為你在這兩個地方都定義了列舉。這就是你的問題所在。
在編譯時,每個物件都會創建一種 "簽名 "作為唯一的識別符號,這樣編譯器就能知道ClassA和ClassB。由于你在兩個類中都定義了列舉,它們也得到了唯一的簽名。
因此,你的列舉不是有兩個簽名,而是有四個簽名。編譯器試圖克隆它(這基本上就是你正在做的事情),但是失敗了,因為它試圖直接映射到一個具有不同簽名的列舉。
從字面上看,就是 "相同的,但不同的,但仍然相同"。
你應該嘗試做的是在類之外定義列舉。
namespace com.path1
{
enum class Meta {
一。
二。
三
}
enum class Message { ONE, TWO, THREE !
一。
二
}
data class ClassA(
@JsonProperty("text")(
val text: 字串。
@JsonProperty("meta"/span>)
val meta: Meta? = null。
@JsonProperty("message")。
val message: = null 訊息?
) {}
}
命名空間 com.path2 {
import com.path1.Meta
import com.path2.Message
data class ClassB(
@JsonProperty("text")(
val text: 字串。
@JsonProperty("meta"/span>)
val meta: Meta? = null。
@JsonProperty("message")。
val message: = null 訊息?
) {}
}
上面的代碼將只編譯2個列舉的簽名。假設你的類的內容保持一致,它們現在都將為列舉類使用相同的簽名。
還要注意我是如何洗掉你的建構式的。如果你想讓每個引數在默認情況下都能被實體化,請完全省略定義一個建構式,因為你在類中定義屬性的方式已經形成了一個建構式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/311881.html
標籤:
