Java中泛型的理解:
Class<? extends Object>是什么意思?
<T>是定义一个泛型
T是让方法返回的类型是之前定义的泛型的类型
Class<? extends T> 这个是定义参数的类型为Class, 但是这个Class必须是和之前定义的泛型有继承关系的。?表示任意类的Class,不过后面跟了extends 表明了条件。
1、? 和 Object 差不多,不过还是有差别。
在这种情况下: class<? extends SomeClass> , Object就不能用了
Object是一个具体的类名,而?是一个占位符号,表示任何类型,只要是SomeClass类或者子类就可以。
List<Object>可以放任何类对象
List<? extends InputStream>就只能放InputStream的实现类了。
运行时刻,没错,Java的泛型是不存在,所以说,效率没有任何影响。
2、泛型中使用通配符?代表类型参数可以是任何对象类型,也可以使用extends表示参数类型可以是某类或其子类,参数类型主要是用于解决早期版中集合取数据时的拆箱操作
3、Java中的泛型是个假泛型,仅仅只是在编译器那边做了语法检查而已,和C#里的泛型不一样的。基本上,不管你在List<>里面写什么类型,编译通过了以后运行时全部都是Object。
4、如果方法参数声明为:
public Page(int start, int totalSize, int pageSize, List<Object> data) {
则构造函数第四个参数传入List<String>,会编译报错。
说明:Java泛型确实是通过类型擦除实现的,编译器的语法检查是次要的,重要的是泛型系统可以为我们做更多的类型检查,这在很多时候是很有帮助的,借助编译器在编译期的类型检查可以减少运行时出现类型错误的几率。
比如foo方法把一个Object对象加入List中,我们期望这个List可以存放任何类型的对象。
如果用原生类型List,就像这个方法,void foo(List list, Object o)
我们可以这么调用foo:
List<Integer> integers = new ArrayList<Integer>();
foo(integers, "bar")
这段代码是可以编译通过的,编译器会有一个警告,但事实上我们并不希望允许这样调用foo,我们的本意是foo的第一个参数是一个可以存放任何类型对象的List,但integers显然不是的。
但如果我们的foo方法是这样子的,void foo(List<Object> list, Object o)
现在如果我们尝试这样子调用foo,就会产生编译错误
List<Integer> integers = new ArrayList<Integer>();
foo(integers, "bar")
编译器的类型检查让我们提前发现了问题,而不是等到程序运行抛出异常时才想到,“嘿,你怎么能这么调用foo?”
Java 反射中getmethods 和 getDeclaredMethods的区别
1、getDeclaredMethods()可以拿到反射类中的公共方法、私有方法、保护方法、默认访问,但不获得继承的方法。
2、getMethods可以拿到反射类及其父类中的所有公共方法。
JAVA中 多态 的理解
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作
优点:
1. 消除类型之间的耦合关系
2. 可替换性
3. 可扩充性
4. 接口性
5. 灵活性
6. 简化性
多态存在的三个必要条件:
1、继承
2、重写
3、父类引用指向子类对象
多态的实现方式:
1、重写
2、接口
3、抽象类和抽象方法