请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

泛型参数如何设置默认值?

class A<T>(val key:T)
如何给key设置一个默认的值呢?

正在回答 回答被采纳积分+3

1回答

bennyhuo 2019-03-09 16:17:26

你想设置什么默认值呢?null吗?

0 回复 有任何疑惑可以回复我~
  • 提问者 panmin #1
    老师,看了您的SharedPreferencesUtil封装的课程,做了一些优化,如下:class SharedPreferencesUtil<T>(context:Context, private val default:T ,spName:String = "default"):ReadWriteProperty<Any,T>{
    
        private val sp by lazy {  context.getSharedPreferences(spName,Context.MODE_PRIVATE)}
    
        @Suppress("UNCHECKED_CAST")
        override fun getValue(thisRef: Any, property: KProperty<*>): T {
            return with(sp){
                when(default){
                    is Int -> getInt(property.name,default)
                    else -> throw IllegalArgumentException("not support type")
                }
            } as T
        }
    
        @SuppressLint("CommitPrefEdits")
        override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
            with(sp.edit()){
                when(value){
                    is Int -> putInt(property.name,value)
                    else -> throw IllegalArgumentException("not support type")
                }
            }.apply()
        }
    }
    
    去掉了name传参数,通过KProperty获取属性名称,我现在是想把default:T 传参也赋上值,比如判断T是Int就赋默认为0之类的,有没有什么方式能获取T的类型做个判断就不用传入default了,Int就默认是0,Boolean就默认false,String就默认""等等
    回复 有任何疑惑可以回复我~ 2019-03-09 21:17:47
  • bennyhuo 回复 提问者 panmin #2
    property.name 你要小心哈,一方面你开了混淆会导致你的name不可控,另一方面你重构代码改名字也会导致属性不能被继承。这是个毒药~
    回复 有任何疑惑可以回复我~ 2019-03-10 08:33:44
  • bennyhuo 回复 提问者 panmin #3
    你可以给default默认置为null,然后再用when判断类型提供默认值。这里默认值还有个重要的作用就是帮助推导泛型类型,如果你不想提供默认值,就得把泛型参数写出来,其实也没多大必要。
    回复 有任何疑惑可以回复我~ 2019-03-10 08:35:49
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信