代码之家  ›  专栏  ›  技术社区  ›  HelloCW

当我希望从Kotlin中的一个sharedPreferences键获得不同的类型值时,如何转换类型?

  •  0
  • HelloCW  · 技术社区  · 6 年前

    代码B来自网页,代码A将导致错误“JavaLang.Studio不能被强制转换为java. Lang.Lon”。

    我试图分析原因:

    首先是 key="hello" 在里面 SharedPreferences 存储字符串的值,然后我希望从同一个键中得到一个long值,当代码B试图转换时,应用程序崩溃。

    我觉得代码B不好,你能修一下吗?

    我猜密码 res as T 在代码B中是坏的。

    代码A

    val key="hello"
    
    try {
        var my1: String by PreferenceTool(this, key, "-1")
        my1 = "2"
    
        val my2: Long by PreferenceTool(this, key, -1L)
        var ss=my2
    }catch (e:Exception){
        logError(e.message?:"None")
    }
    

    代码B

    class PreferenceTool<T>(private val context: Context, private val name: String,  private val default: T) {
    
        private val prefs: SharedPreferences by lazy {       
            context.defaultSharedPreferences        
        }
    
        operator fun getValue(thisRef: Any?, property: KProperty<*>): T = findPreference(name, default)
    
        operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
            putPreference(name, value)
        }
    
        @Suppress("UNCHECKED_CAST")
        private fun findPreference(name: String, default: T): T = with(prefs) {
            val res: Any = when (default) {
                is Long -> getLong(name, default)
                is String -> getString(name, default)
                is Int -> getInt(name, default)
                is Boolean -> getBoolean(name, default)
                is Float -> getFloat(name, default)
                else -> throw IllegalArgumentException("This type can be saved into Preferences")
            }
    
            res as T
        }
    
        @SuppressLint("CommitPrefEdits")
        private fun putPreference(name: String, value: T) = with(prefs.edit()) {
            when (value) {
                is Long -> putLong(name, value)
                is String -> putString(name, value)
                is Int -> putInt(name, value)
                is Boolean -> putBoolean(name, value)
                is Float -> putFloat(name, value)
                else -> throw IllegalArgumentException("This type can't be saved into Preferences")
            }.apply()
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   shiftpsh    6 年前

    共享的引用保存 类型 以及键/值。例如:

    <string name="last-version">8.clan.0h</string>
    <int name="last-city" value="3" />
    <boolean name="record-cached" value="true" />
    

    所以如果你打电话 PreferenceTool(this, key, "-1") ,你在找钥匙 hello ,另存为 String ,它将按预期工作。


    但是,如果我们研究sharedreferences类中getlong的实现:

    /**
     * Retrieve a long value from the preferences.
     * 
     * @param key The name of the preference to retrieve.
     * @param defValue Value to return if this preference does not exist.
     * 
     * @return Returns the preference value if it exists, or defValue.  Throws
     * ClassCastException if there is a preference with this name that is not
     * a long.
     * 
     * @throws ClassCastException
     */
    long getLong(String key, long defValue);
    

    键的类型 你好 另存为 ,所以什么时候 PreferenceTool 电话 getLong 你会得到一个 ClassCastException 如文件所示。

    您可以在此处查看文档:

        2
  •  0
  •   unzila    6 年前

    Kotlin中的字符串已具有可调用的扩展函数

    toLong()
    

    在代码中使用这个。