Skip to content

Commit 3e82a0c

Browse files
committed
试试
1 parent 4b3bc52 commit 3e82a0c

34 files changed

Lines changed: 587 additions & 19 deletions
2.61 MB
Binary file not shown.

WebContent/WEB-INF/web.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
55
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
66
version="3.1"
7-
metadata-complete="true">
7+
metadata-complete="false">
8+
<!-- version="3.1" 这里可以看servlet的版本,servlet3.0必须使用JDK1.6以上版本,tomcat必须是7.0及以上,tomcat6.0不支持 -->
89

910
<!--web.xml文件的继承,每个完整的JavaWeb应用中都需要有web.xml,但我们不知道所有的web.xml文件都有一个共同的父文件,它在tomcat的conf/web.xml路径。
1011
如果一个请求没有任何一个servlet处理,这是就会用到conf/web.xml文件里面的default这个servlet,这个servlet会显示404页面。

src/com/yale/test/java/demo/string/StringTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ public static void main(String[] args) {
2222
String sp = "A,B,C,D";
2323
String[] ss = sp.split("\\,"); // {"A", "B", "C", "D"}
2424
System.out.println("使用split()方法,并且传入的也是正则表达式" + ss);
25+
//使用索引访问用String的split方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛IndexOutOfBoundsException的风险。
26+
String str = "a,b,c,,";
27+
String[] ary = str.split(",");
28+
//预期大于3,结果是3
29+
System.out.println(ary.length);
2530

2631
String[] arr = {"A", "B", "C"};
2732
String sar = String.join("***", arr); // "A***B***C"

src/com/yale/test/java/fanxing/IMessage.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
/**
44
* 泛型接口
55
* @author dell
6-
*
76
* @param <T>
87
*/
98
public interface IMessage<T> {
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.yale.test.java.fanxing;
2+
3+
import java.lang.reflect.ParameterizedType;
4+
import java.lang.reflect.Type;
5+
6+
/*
7+
* 泛型继承
8+
* 一个类可以继承自一个泛型类。例如:父类的类型是Pair<Integer>,子类的类型是IntPair,可以这么继承:
9+
* 使用的时候,因为子类IntPair并没有泛型类型,所以,正常使用即可:
10+
*/
11+
public class IntPair extends Pair<Integer>{
12+
public IntPair() {
13+
super(11, 22);
14+
}
15+
16+
public static void main(String[] args) {
17+
IntPair ip = new IntPair();
18+
/*
19+
* 前面讲了,我们无法获取Pair<T>的T类型,即给定一个变量Pair<Integer> p,无法从p中获取到Integer类型。
20+
* 但是,在父类是泛型类型的情况下,编译器就必须把类型T(对IntPair来说,也就是Integer类型)保存到子类的class文件中,
21+
* 不然编译器就不知道IntPair只能存取Integer这种类型。
22+
* 在继承了泛型类型的情况下,子类可以获取父类的泛型类型。例如:IntPair可以获取到父类的泛型类型Integer。获取父类的泛型类型代码比较复杂:
23+
*/
24+
Class<IntPair> clazz = IntPair.class;
25+
Type t = clazz.getGenericSuperclass();
26+
if (t instanceof ParameterizedType) {
27+
ParameterizedType pt = (ParameterizedType)t;
28+
Type[] types = pt.getActualTypeArguments();//可能有多个泛型类型
29+
Type firstType = types[0];//取第一个泛型类型
30+
Class<?> typeClass = (Class<?>) firstType;
31+
System.out.println("父类的泛型类型为:" + typeClass);
32+
}
33+
/*
34+
* 因为Java引入了泛型,所以,只用Class来标识类型已经不够了。实际上,Java的类型系统结构如下:
35+
┌────┐
36+
│Type│
37+
└────┘
38+
39+
40+
┌────────────┬────────┴─────────┬───────────────┐
41+
│ │ │ │
42+
┌─────┐┌─────────────────┐┌────────────────┐┌────────────┐
43+
│Class││ParameterizedType││GenericArrayType││WildcardType│
44+
└─────┘└─────────────────┘└────────────────┘└────────────┘
45+
*/
46+
47+
}
48+
}

src/com/yale/test/java/fanxing/MesNumber.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,21 @@
22

33
public class MesNumber<T extends Number> {//这里不能用super
44
private T node;
5+
6+
public MesNumber(Class<T> clazz) throws InstantiationException, IllegalAccessException{
7+
/*
8+
* 局限四:不能实例化T类型:
9+
* 要实例化T类型,我们必须借助额外的Class<T>参数:
10+
* 代码借助Class<T>参数并通过反射来实例化T类型,使用的时候,也必须传入Class<T>。例如:
11+
* MesNumber<Integer> pair = new MesNumber<>(Integer.class);
12+
*/
13+
//node = new T();
14+
node = clazz.newInstance();
15+
}
516

17+
18+
public MesNumber() {
19+
}
620
public T getNode() {
721
return node;
822
}

src/com/yale/test/java/fanxing/MesSuper.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,17 @@ public T getNode() {
1010
public void setNode(T node) {
1111
this.node = node;
1212
}
13+
14+
/*
15+
* 不恰当的覆写方法
16+
* 有些时候,一个看似正确定义的方法会无法通过编译。例如:
17+
* 这是因为,定义的equals(T t)方法实际上会被擦拭成equals(Object t),而这个方法是继承自Object的,编译器会阻止一个实际上会变成覆写的泛型方法定义。
18+
* 换个方法名,避开与Object.equals(Object)的冲突就可以成功编译:
19+
*/
20+
// public boolean equals(T t) {
21+
// return this == t;
22+
// }
23+
public boolean same (T t) {
24+
return this == t;
25+
}
1326
}

src/com/yale/test/java/fanxing/Message.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,20 @@ public static void main(String[] args) {
7474

7575
ArrayList<String> al = new ArrayList<String>();
7676
ArrayList<Float> alf = new ArrayList<Float>();
77-
if (al.getClass() == alf.getClass()) {
77+
if (al.getClass() == alf.getClass()) {//局限二:无法取得带泛型的Class。观察以下代码:
7878
/**
7979
* 运行期间无法获取泛型实际类型
8080
* 由于编译之后,泛型就被擦除,所以在代码运行期间,Java 虚拟机无法获取泛型的实际类型。
8181
* 上面这段代码,从源码上两个 List 看起来是不同类型的集合,但是经过泛型擦除之后,集合都变为 ArrayList。所以 if语句中代码将会被执行。
82+
* 换句话说,所有泛型实例,无论T的类型是什么,getClass()返回同一个Class实例,因为编译后它们全部都是Pair<Object>。
8283
*/
8384
System.out.println("运行期间无法获取泛型实际类型");
8485
}
8586

87+
//局限三:无法判断带泛型的类型:
88+
//if (al instanceof ArryList<String>) {//编译报错,原因和前面一样,并不存在ArryList<String>.class,而是只有唯一的ArryList.class。
89+
//}
90+
8691

8792
System.out.println("泛型总结:泛型的缺点:1,由于需要向后兼容,导致泛型会在编译后将泛型擦除。2,运行效率低,由于不支持");
8893
System.out.println("泛型总结:泛型的缺点:2,由于泛型擦除后,原来的泛型就变成Object类了,所以泛型没办法支持基本类型,因为基本类型int,long不能向上转型为Object类型。");

src/com/yale/test/java/fanxing/MessageNumberImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
/**
44
* 泛型类型只允许引用类型(类和接口,不能使用基本数据类型)
5+
* 编写泛型类比普通类要复杂。通常来说,泛型类一般用在集合类中,例如ArrayList<T>,我们很少需要编写泛型类。
6+
* T extends Number意思是所有泛型类型为Number或Number子类
7+
* 这种使用<? extends Number>的泛型定义称之为上界通配符(Upper Bounds Wildcards),即把泛型类型T的上界限定在Number了。
58
* @author dell
6-
*
79
* @param <T>
810
*/
911
public class MessageNumberImpl<T extends Number> implements IMessage<T> {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.yale.test.java.fanxing;
2+
3+
public class Pair<T> {
4+
private T first;
5+
private T last;
6+
7+
public Pair(T first, T last) {
8+
this.first = first;
9+
this.last = last;
10+
}
11+
12+
public T getFirst() {
13+
return first;
14+
}
15+
16+
public void setFirst(T first) {
17+
this.first = first;
18+
}
19+
20+
public T getLast() {
21+
return last;
22+
}
23+
24+
public void setLast(T last) {
25+
this.last = last;
26+
}
27+
}

0 commit comments

Comments
 (0)