个人笔记,没有参考价值😈,为节约您的学习时间,请绕道查找其他资料
集合 Collection
set集合中中存放的元素是不一样的
范型的定义👇
// >> TODO 定义泛型,就是把需要的类型定义在类后面的尖括号里,然后在类里面就可以把定义好的泛型像符号一样使用
public class MyGenericClass<First, Second> {
// >> TODO 实际上这两个引用都是Object类型的
private First first;
private Second second;
public MyGenericClass(First first, Second second) {
this.first = first;
this.second = second;
}
public First getFirst() {
return first;
}
public void setFirst(First first) {
this.first = first;
}
public Second getSecond() {
return second;
}
public void setSecond(Second second) {
this.second = second;
}
public <Another> Another getAnother(Object val) {
return (Another) val;
}
}
范型的协变和逆变
// >> TODO 协变语法如下,意思就是这个参数可以接受的List引用的泛型类型为Parent或者其子类
public static void extMethod(List<? extends Parent> extParam) {
}
// 下面这种写法的话,justG2Method() 方法参数的类型只能是Parent
public static void justG2Method(List<Parent> extParam) {
}
以下问题的解释为范型是类型擦除的(关于类型擦除移步Google)
List<? extends Parent> g2ListExt = null;
// >> TODO 但是使用这个带协变泛型的引用,我们无法让具体的类型满足其参数要求
// >> TODO 是不是感觉世界观被震碎了,别着急崩坏,这都是有原因的
// g2ListExt.add(new GrandParent());
// g2ListExt.add(new Parent());
// g2ListExt.add(new Children());
// >> TODO 原因是如果 Java 允许了,那么就会造成潜在的错误
List<Children> g3OnlyList = new ArrayList<>();
g2ListExt = g3OnlyList;
// >> TODO 这时候再看下一行,如果允许 add 一个Parent的对象,就代表着什么呢?
// g2ListExt.add(new Parent());
// >> TODO 那就代表着,原本只应该有Children或者其子类的g3OnlyList引用指向的对象,结果通过使用g2ListExt,被放进去一个Parent的实例
逆变和协变正好相反,它允许的类型为Parent 或者其父类
// >> TODO 除了协变,Java 还有逆变,语法如下
// >> TODO 逆变和协变正好相反,允许的类型为Parent或者其父类
List<? super Parent> g2ListSup = null;
注解 annotation,定义注解的方式如下👇
// TODO 注解可以被用在哪个/哪些元素上
@Target(ElementType.METHOD)
// TODO 注解会被留存到哪阶段
@Retention(RetentionPolicy.RUNTIME)
// TODO 以上两个元素是每个注解都必须要有的
// TODO 定义一个自己的annotation,需要@interfae,实际上这个接口会继承Annotation接口
public @interface PrimaryProperty {
// >> TODO annotation支持的类型有基本数据类型,Class,String,枚举,其它注解,以上类型的数组
// TODO 可以指定缺省值
String defaultValue() default "N/A";
Class targetClass();
int abc();
String[] defaultValues();
// TODO 注解类型的缺省值
Override is() default @Override;
}
自定义的注解的使用示例
public class TestUseAnnotation{
// @PrimaryProperty(defaultValue = "testbggg", targetClass = TestUseAnnotation.class,
// abc = 9, defaultValues = {"aaa", "bbb"})
private Object abc;
@Deprecated
// TODO 给annotation里的属性赋值的方式
@PrimaryProperty(defaultValue = "testbggg", targetClass = TestUseAnnotation.class,
abc = 9, defaultValues = {"aaa", "bbb"})
public void test() {
}
}
Lambda表达式 V.S. 匿名内部类
// TODO 匿名内部类版
myList.forEach(
new Consumer<String>() {
@Override
public void accept(String s) {
processString(outside + s);
}
}
);
// TODO lambda的表达式必须能够符合接口中定义的抽象方法,从参数,到返回值,到异常,都必须匹配
// TODO lambda 完整版 (参数) -> {代码块}
// TODO lambda可以有返回值,使用return语句就可以,当然我们这个接口没有,我们的lambda表达式也不能有
// TODO lambda可以使用外部数据,怎么看都和匿名内部类是一样的
myList.forEach(
(s) -> { // 这个 s 在方法中就是参数
processString(outside + s); // 这就是方法体
}
);
网友评论