public static void main(String[] args){
//p1对象中x和y的属性类型都是Integer
Point p1 = new Point();
p1.x = 1;
p1.y = 2;
//p2对象中x和y的属性类型都是String
Point p2 = new Point();
p2.x = "1";
p2.y = "2";
//p3对象中x和y的属性类型都是Object
Point p3 = new Point();
p3.x = new Object();
p3.y = new Object();
}
import java.util.ArrayList;
import java.util.List;
public class Demo01 {
public static void main(String[] args) {
//创建一个ArrayList集合
List list = new ArrayList();
//添加String类型的数据
list.add("aaaa");
//添加Integer类型的数据(int会自动包装为Integer)
list.add(100);
//第一种方式,用Object类型接收输出
// for(int i = 0; i
第一种方式输出的结果: aaaa 100
第二种方式的输出结果: aaaa Exception in thread “main” java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at Test9.test01.Demo01.main(Demo01.java:24)
import java.util.ArrayList;
import java.util.List;
public class Demo01 {
public static void main(String[] args) {
//创建一个ArrayList集合
List list = new ArrayList();
//添加String类型的数据
list.add("aaaa");
//添加Integer类型的数据(int会自动包装为Integer)
// list.add(100); //这句代码报错了
//指定用String类型接收
for(int i = 0; i
//泛型类
public class Point{...}
//创建泛型类对象
public static void main(String[] args){
Point p = new Point();
}
代码样例:
public class Generic{
//key这个成员变量的类型为T,T的类型由外部指定
private T key;
//泛型构造方法形参key的类型也为T,T的类型由外部指定
public Generic(T key) {
this.key = key;
}
//泛型方法getKey的返回值类型为T,T的类型由外部指定
public T getKey(){
return key;
}
}
//在实例化泛型类时,必须指定T的具体类型
//传入的实参类型需与泛型的类型参数类型相同,即为Integer.
Generic integer = new Generic(123456);
//传入的实参类型需与泛型的类型参数类型相同,即为String.
Generic string = new Generic("lalala");
System.out.println(integer.getkey());
System.out.println(string.getkey());
//泛型接口
public interface Action{...}
public static void main(String[] args){
//使用匿名内部类实现接口,且指定了这个接口的类型为String
Action a = new Action<>(){
//...
};
}
2.3 泛型方法
泛型参数定义在方法上面,那么这个方法就是泛型方法
//泛型方法
public class Test{
public T test(T t){
//...
}
}
//泛型方法中的返回类型和参数类型都得是泛型才能叫泛型方法,否则只是带泛型参数的普通方法或者返回值为泛型的普通方法
public static void main(String[] args){
Test t = new Test();
String str = t.test("hello");
Integer i = t.test(1);
Double d = t.test(10.5D);
}
3、泛型的类型
先观察下面的代码
//编译通过,父类型的引用,指向子类对象
Object o = new Integer(1);
//编译通过,Object[]类型兼容所有的【引用】类型数组,arr可以指向任意 引用类型 数组对象
Object[] arr = new Integer[1];
//编译失败,类型不兼容,int[] 是基本类型数组
Object[] arr = new int[1];
//编译失败,错误信息:ArrayList无法转为ArrayList
俩个类型,如果是当做泛型的指定类型的时候,就没有多态的特点了
4、泛型通配符
4.1 怎么用
public void test1(Collection c){}
public void test2(Collection c){}
public void test3(Collection c){}
Collection> c;
c = new ArrayList();
c.add("hello");
//编译报错
//因为变量c所声明的类型是Collection,同时泛型类型是通配符(?),那么编译器也不知道这个?将来会是什么类型,因为这个?只是一个通配符,所以,编译器不允许使用变量c来向集合中添加新数据。
c.add(null);
//编译通过
//集合中一定存的是引用类型,null是所有引用类型共同的一个值,所以一定可以添加进去。
5、泛型边界
使用extends和super关键字对泛型的类型进行限制。如规定泛型的上限和下限。
5.1 上限
例如:List extends Number> list 将来引用list就可以接收泛型是Number或者Number子类型的List集合对象
public static void main(String[] args) {
List extends Number> list;
//list可以指向泛型是Number或者Number【子】类型的集合对象
list = new ArrayList();
list = new ArrayList();
list = new ArrayList();
//编译报错,因为String不是Number类型,也不是Number的子类型
//list = new ArrayList();
5.2 下限
例如:List super Number> list 将来引用list就可以接收泛型是Number或者Number父类型的List集合对象
public static void main(String[] args) {
List super Number> list;
//list可以指向泛型是Number或者Number【父】类型的集合对象
list = new ArrayList();
list = new ArrayList();
list = new ArrayList();
//编译报错,因为String不是Number类型,也不是Number的父类型
//list = new ArrayList();
//编译报错,因为Integer不是Number类型,也不是Number的父类型
//list = new ArrayList();}