文章列表
这一章节我们讨论一下类型擦除。
1.什么是类型擦除?
在java里面泛型其实是伪泛型,因为他都只是在编译器里面实现的,在jvm里面是没有泛型的概念。
我们看下面的代码:
package com.ray.ch11;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<String> li ...
- 2015-12-13 22:52
- 浏览 503
- 评论(0)
这一章节我们来展示一下怎样利用泛型构建复杂模型?
1.元组列表
我们之前已经说过元组是一个复杂的模型,可以返回多对象。
package com.ray.ch11;
import java.util.ArrayList;
public class Test {
public ArrayList<Tuple<A, B, C>> test() {
ArrayList<Tuple<A, B, C>> list = new ArrayList<Tuple<A, B, C>>();
for (int i = 0; i & ...
- 2015-12-13 20:56
- 浏览 484
- 评论(0)
这一章节我们来讨论一下泛型方法的使用。
泛型除了可以作用在类、接口上面,还可以作用在方法上面。
1.例子
package com.ray.ch13;
public class Test {
public <T> void test(T x) {
System.out.println(x.getClass().getName());
}
public static void main(String[] args) {
Test test = new Test();
test.test("1");
test.test(1);
test. ...
- 2015-12-11 16:34
- 浏览 391
- 评论(0)
这一章节我们来讨论一下泛型接口的使用。
我们以生成器为例子(generator),生成器是工厂方法的一种运用,主要用来创建对象,一般使用工厂方法都是需要输入参数以便取得不同的对象,但是生成器是生成一系列的对象。
代码:
package com.ray.ch13;
import java.util.Iterator;
import java.util.Random;
public class Test implements Generator<Father> {
private Class<?>[] classes = { Sub1.class, Sub2.cla ...
- 2015-12-11 11:41
- 浏览 461
- 评论(0)
这一章节我们来讨论一下利用元组的方式返回多类型对象。
1.定义元组
@SuppressWarnings("hiding")
class Tuple<A, B> {
public final A a;
public final B b;
public Tuple(A a, B b) {
this.a = a;
this.b = b;
}
}
这里可能有人会问到安全的问题,我们做出一些解释:大家注意我们的属性域都是使用了final,这样迫使创建新的对象,而不是对原对象进行修改。
2.利用元组的方式返回多个对象
package com.ray. ...
- 2015-12-10 11:21
- 浏览 362
- 评论(0)
这一章节我们来讨论一下泛型与容器,准确来说是由于容器的需求而产生泛型的需求。
我们平常在编程的时候,大部分都是用了容器来装载对象,我们来看一下容器的演变。
1.普通容器
package com.ray.ch11;
public class Test {
public stat ...
- 2015-12-10 09:31
- 浏览 427
- 评论(0)
这一章节我们来讨论一下接口与类型信息。
在之前的章节里面我们提到接口,父类引用子类对象,然后把方法给缩窄了,但是我们这一章节学习到反射,这个约束就变得没有那么严格。
我们来看看下面的例子:
package com.ray.ch11;
public class Test {
public static void main(String[] args) {
Person man = new Man();
man.sleep();
man.run();
// man.say();//error
}
}
interface Person {
public void slee ...
- 2015-12-10 08:49
- 浏览 354
- 评论(0)
这一章节我们讲述一下代理以及动态代理。
1.为什么需要代理?
答案:有一些操作你不想整合到逻辑代码里面,因此需要代理来做这个事情。例如:日志、监控等
下面将演示一个简单的代理:
package com.ray.ch11;
public class Test {
public static void test(InterFace interFace) {
interFace.doSomething();
interFace.doElsething();
}
public static void main(String[] args) {
test(new RealObjec ...
- 2015-12-08 21:17
- 浏览 323
- 评论(0)
这一章节我们来讨论一些利用反射提取类的方法与构造器。
1.例子
package com.ray.ch11;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Test {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
try {
Class<Person> personClass ...
- 2015-12-08 19:58
- 浏览 363
- 评论(0)
这一章节主要讲述一下三个检测对象类型的方法instanceof、isInstance和isAssignableFrom。
例子:
package com.ray.ch12;
public class Test {
public static void main(String[] args) {
try {
Class<? extends Father> AClass1 = (Class<? extends Father>) Class
.forName("com.ray.ch12.Sub");
System.out.pr ...
- 2015-12-07 20:05
- 浏览 447
- 评论(0)
这一章节我们来讨论一下Class对象的泛化。
1.为什么需要泛化?
代码在编译时就可以进行类型检测,不需要等到运行时才检测类型。
2.例子
package com.ray.ch12;
public class Test {
public static void main(String[] args) {
try {
Class AClass1 = ...
- 2015-12-04 22:45
- 浏览 390
- 评论(0)
这一章节我们来讨论一下得到Class对象的另一种方式.class。
1.例子
package com.ray.ch12;
public class Test {
public static void main(String[] args) {
System.out.println(Person.class.getName());
}
}
class Person {
static {
System.out.println("loading person");
}
public Person() {
System.out. ...
- 2015-12-04 22:24
- 浏览 482
- 评论(0)
这一章节我们接着上一章节,继续讲述Class对象的使用与注意点。
1.使用例子
package com.ray.ch11;
public class Test {
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(String[] args) {
try {
Class<Swimmer> swimmerClass ...
- 2015-12-04 15:53
- 浏览 399
- 评论(0)
这一章节我们来介绍一下Class对象。
在介绍前有几点需要注意的:
1.每一个类都有一个Class对象,在jvm的类加载器子系统里面生成。
2.类加载器子系统包含类加载器链,但是只有一个原生加载器,原生加载器主要加载javaapi里面的可信的类。
3.只有当类被使用的时候才会加载,这个称之为动态加载。
4.只有加载了Class,才能new这个类的所有对象。
由于前面几点都暂时没有办法证明,只能当概念记住,我们下面举例说明最后一点:
package com.ray.ch11;
public class Test {
public static void main(String[] args) ...
- 2015-12-04 15:30
- 浏览 351
- 评论(0)
这一章节我们来讨论一下为什么需要RTTI(Run-Time Type Identification)。
答案:RTTI维护类型的信息,为多态机制的实现提供基础。
1.怎么为多态的实现提供基础?
多态,主要就是通过向上转型,然后通过泛化来父类引用子类对象。
...
- 2015-12-03 21:16
- 浏览 430
- 评论(0)