Unchecked cast: Any! to T

泛型preference委托 检查出类型不安全时,但您又确定当前类型是安全的。Unchecked cast: Any! to T
这时可以使用注解 在方法上添加一个注解@SuppressWarnings(“unchecked”) 不让他去检查这个值

例如1:

  @SuppressWarnings("unchecked")
    public static <T> T cast(Object obj) {
        return (T) obj;
    }

例如2:

    @SuppressWarnings("unchecked")
    private fun findPreferenceByName(name: String, default: T): T = with(ref) {
        val res:Any?= when (default) {
            is Int -> getInt(name, default)
            is Boolean -> getBoolean(name, default)
            is String -> getString(name, default)
            is Long -> getLong(name, default)
            is Float -> getFloat(name, default)
            else -> throw IllegalArgumentException("this type not support")
        }
        return res!! as T
    }

完整的自定义委托对象by Delegates.notNull()


import android.content.Context
import android.content.SharedPreferences
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

/**
 * author : Jeff  5899859876@qq.com
 * Github: https://github.com/Jay-YaoJie
 * Created :  2018-11-17.
 * description :自定义委托对象by Delegates.notNull()
 */
object DelegatesExt {
    //现在你可以创建一个对象,然后添加函数使用你的委托:
    fun <T> notNullSingleValue(): ReadWriteProperty<Any?, T> = NotNullSingleValueVar()
    fun <T> getPreference(context: Context, name: String, default: T): ReadWriteProperty<Any?, T> =
        Preference(context, name, default)
}

/**
 * Kotlin库提供了几个接口,我们自己的委托必须要实
 * 现: ReadOnlyProperty 和 ReadWriteProperty 。具体取决于我们被委托的对
 * 象是 val 还是 var 。
 * 我们要做的第一件事就是创建一个类然后继承 ReadWriteProperty */
class NotNullSingleValueVar<T> : ReadWriteProperty<Any?, T> {

    private var value: T? = null
    //Getter函数 如果已经被初始化,则会返回一个值,否则会抛异常。
    override fun getValue(thisRef: Any?, property: KProperty<*>): T {
        return value ?: throw IllegalStateException("${property.name} not initialized")
    }

    //Setter函数 如果仍然是null,则赋值,否则会抛异常。
    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        this.value = if (this.value == null) value else throw IllegalStateException("${property.name} not initialized")
    }
}

/**
 * https://www.ctolib.com/docs/sfile/kotlin-for-android-developers-zh/fan_xing_preference_wei_tuo.html
 * 泛型preference委托
 * https://www.ctolib.com/docs/sfile/kotlin-for-android-developers-zh/fang_wen_shared_preferences.html
 * 访问Shared Preferences
 * **/
class Preference<T>(val context: Context, val name: String, val default: T) : ReadWriteProperty<Any?, T> {
    val ref: SharedPreferences by lazy { context.getSharedPreferences("News", Context.MODE_PRIVATE) }
    override fun getValue(thisRef: Any?, property: KProperty<*>): T {
        return findPreferenceByName(name, default) }
    override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        putPreference(name, value)
    }
     // https://www.cnblogs.com/nexiyi/p/how_to_avoid_unchecked_cast.html
    // 在这里会产生 Unchecked cast: Any to T
    @SuppressWarnings("unchecked")
    private fun findPreferenceByName(name: String, default: T): T = with(ref) {
        val res:Any?= when (default) {
            is Int -> getInt(name, default)
            is Boolean -> getBoolean(name, default)
            is String -> getString(name, default)
            is Long -> getLong(name, default)
            is Float -> getFloat(name, default)
            else -> throw IllegalArgumentException("this type not support")
        }
        return res!! as T
    }
    private fun putPreference(name: String, value: T) = with(ref.edit()) {
        when (value) {
            is Int -> putInt(name, value)
            is Boolean -> putBoolean(name, value)
            is String -> putString(name, value)
            is Long -> putLong(name, value)
            is Float -> putFloat(name, value)
            else -> throw IllegalArgumentException("this type not support")
        }.apply()
    }

}
  • 1
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:终极编程指南 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

香言香语

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值