实习期间笔记收获
Posted 今晚打老虎666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实习期间笔记收获相关的知识,希望对你有一定的参考价值。
实习期间笔记收获
1.java中的instanceof
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。
instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必项。任意对象表达式。
Class:必选项。任意已定义的对象类。
说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
2.在代码中引用attr资源文件
TypedValue typedValue = new TypedValue();
getContext().getTheme().resolveAttribute(R.attr.privacy_dialog_background_new, typedValue, true);
int aaa=typedValue.resourceId;
assert win != null;
win.setBackgroundDrawableResource(aaa);
3.kotlin泛型
首先java中的? extends:
这个 ? extends 叫做「上界通配符」,可以使 Java 泛型具有「协变性 Covariance」,协变就是允许下面的赋值是合法的。
在继承关系树中,子类继承自父类,可以认为父类在上,子类在下。extends 限制了泛型类型的父类型,所以叫上界。```bash
List buttons = new ArrayList();
👇
List<? extends TextView> textViews = buttons;
一般来说子类的泛型不属于泛型的子类,也就是说button虽然是textview的子类但是list不是list的子类。所以在java中以下代码会报错
TextView textView = new Button(context);
// 👆 这是多态
List<Button> buttons = new ArrayList<Button>();
List<TextView> textViews = buttons;
// 👆 多态用在这里会报错 incompatible types: List<Button> cannot be converted to List<TextView>
但是通过一个? extends却能打破这样的限制,使得代码能正常运行。
List<Button> buttons = new ArrayList<Button>();
👇
List<? extends TextView> textViews = buttons;
但是使用了? extends的泛型可以用get方法,不能用add方法
List<? extends TextView> textViews = new ArrayList<Button>();
TextView textView = textViews.get(0); // 👈 get 可以
textViews.add(textView);
// 👆 add 会报错,no suitable method found for add(TextView)
分析:list里面是一个不知道具体类型的泛型,? extends限制了list中这个泛型的上界,使得它的父类是Textview,从textviews中get到的,一定是textview的子类,根据多态的性质,把它赋值给textview是没问题的。
但是对于add来说,由于我们不确定textviews里面的具体泛型类型,有可能是button,也有可能是textview,这个时候我们把textview通过add操作添加到textViews中,当然,对于泛型是textview的情况肯定没问题,但是对于button的情况肯定会出错。
(List<? extends TextView> 的泛型类型是个未知类型 ?,编译器也不确定它是啥类型,只是有个限制条件。
由于它满足 ? extends TextView 的限制条件,所以 get 出来的对象,肯定是 TextView 的子类型,根据多态的特性,能够赋值给 TextView,啰嗦一句,赋值给 View 也是没问题的。
到了 add 操作的时候,我们可以这么理解:
List<? extends TextView> 由于类型未知,它可能是 List,也可能是 List。
对于前者,显然我们要添加 TextView 是不可以的。
实际情况是编译器无法确定到底属于哪一种,无法继续执行下去,就报错了。
那我干脆不要 extends TextView ,只用通配符 ? 呢?
这样使用 List<?> 其实是 List<? extends Object> 的缩写。)
java中? super:
List<? super Button> buttons = new ArrayList<TextView>();
这个 ? super 叫做「下界通配符」,可以使 Java 泛型具有「逆变性 Contravariance」。
与上界通配符对应,这里 super 限制了通配符 ? 的子类型,所以称之为下界。
它也有两层意思:
通配符 ? 表示 List 的泛型类型是一个未知类型。
super 限制了这个未知类型的下界,也就是泛型类型必须满足这个 super 的限制条件。
super 我们在类的方法里面经常用到,这里的范围不仅包括 Button 的直接和间接父类,也包括下界 Button 本身。
super 同样支持 interface。
上面的例子中,TextView 是 Button 的父类型 ,也就能够满足 super 的限制条件,就可以成功赋值了。
可以使用泛型通配符 ? extends 来使泛型支持协变,但是「只能读取不能修改」,这里的修改仅指对泛型集合添加元素,如果是 remove(int index) 以及 clear 当然是可以的。
可以使用泛型通配符 ? super 来使泛型支持逆变,但是「只能修改不能读取」,这里说的不能读取是指不能按照泛型类型读取,你如果按照 Object 读出来再强转当然也是可以的。
kotlin中:使用关键字 out 来支持协变,等同于 Java 中的上界通配符 ? extends。
使用关键字 in 来支持逆变,等同于 Java 中的下界通配符 ? super。
以上是关于实习期间笔记收获的主要内容,如果未能解决你的问题,请参考以下文章