logoํƒœ์˜์ด์˜ ๊ณต๋ถ€๋ฐฉ

๐Ÿค” Abstract classes can't be instantiated!

2024๋…„ 08์›” 02์ผ

โœจ ์˜ค๋Š˜ ๊ณต๋ถ€ํ•œ ๊ฒƒ

- ์‹ฌํ™” ์ฃผ์ฐจ ๊ฐœ์ธ ๊ณผ์ œ
- ์ˆ™๋ จ ์ฃผ์ฐจ ํŠน๊ฐ• ๋ณต์Šต

๋ฌธ์ œ ์ƒํ™ฉ

๋ณด๊ด€ํ•จ์— ์ €์žฅํ•œ ๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ Shared Preference๋กœ ์ €์žฅ์„ ํ–ˆ์—ˆ๋‹ค. ์›๋ž˜๋Š” ์ž˜ ๋์—ˆ์ง€๋งŒ ๊ฐ์ฒด๋ฅผ sealed class๋กœ ๋ฐ”๊พธ์ž ๋งˆ์ž ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

val listType = object : TypeToken<MutableList<ListItem>>() {}.type
// ์ด ์ค„์—์„œ json์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋„์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ..
return gson.fromJson(jsonString, listType)

com.google.gson.JsonIOException: Abstract classes can't be instantiated! Register an InstanceCreator or a TypeAdapter for this type.

์ด ํƒ€์ž…์— ๋Œ€ํ•ด TypeAdapter๋ฅผ ์ง€์ •ํ•ด๋‹ฌ๋ผ๋Š” ๋œป.. ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ ์ฐพ์•„๋ณด๋‹ˆ CustomDeserializer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

ํ•ด๊ฒฐ

ํƒ€์ž…์ด ๋‹ค ๋ฌธ์ž์—ด์ด์—ฌ์„œ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ์—๋Š” ์–ด๋ ค์šด ์ ์€ ์—†์—ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ ,

	class CustomerDeserializer : JsonDeserializer<ListItem> {
    	override fun deserialize(
        	json: JsonElement,
            typeOfT: Type?,
            context: JsonDeserializationContext?
        ): ListItem {
        	val jsonObject = json.asJsonObject
        	return if (jsonObject.has("thumbnail")) ListItem.VideoItem(
        		thumbnail = jsonObject.get("thumbnail").asString,
        		title = jsonObject.get("title").asString,
        		datetime = jsonObject.get("datetime").asString,
        		isBookmarked = jsonObject.get("isBookmarked").asBoolean
    		)
    		else ListItem.ImageItem(
    			thumbnailUrl = jsonObject.get("thumbnailUrl").asString,
    			siteName = jsonObject.get("siteName").asString,
  	  			datetime = jsonObject.get("datetime").asString,
    			isBookmarked = jsonObject.get("isBookmarked").asBoolean
    		)
    	}
}

GsonBuilder()๋ฅผ ์‚ฌ์šฉํ•ด ์ ์šฉํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

private val gson =
	GsonBuilder().registerTypeAdapter(ListItem::class.java, CustomerDeserializer()).create()