Java学习之:JDK1.5 新特性之泛型

(一)JDK1.5新特性
1.1方法的可变参数

设计一个方法,可以接收任意个数的整数,并返回他们的相加结果

public class Test {
    public static void main(String[] args) {
        System.out.println(add(1,2,3,4,5));     //15
        System.out.println(add(-2,-1,0,1,2));   //0
        System.out.println(add(new int[]{1,2,3,3,5})); //可以接收数组,所以可变参数实质还是数组
        System.out.println(add(new int[]{1,-1}));
    }

    public static int add(int... data) {
        int result = 0;
        for (int temp : data) {
            result += temp;
        }
        return result;
    }
}

可变参数-语法

数据类型 ... 可变参数名称 eg:int … data

可变参数本质上还是数组,因为它可以接收数组

一个方法中只允许有一个可变参数,可变参数只能有一个,如果有多个参数,可变参数要写在最后

1.2 foreach循环

只用于数组,类集内容的取得,不能修改原数组,类集内容。

for(数据类型 临时变量 :数组名/类集名称) eg: for(int temp :data)

1.3 静态导入(了解)

将一个类的所有静态域全部导入到使用类中,此时使用类调用该类的方法和属性不用再带类名

(二)泛型 ->避免classcastexception(向下强转产生)
2.1 泛型类

(1)指的是在类定义时不会设置类中属性或方法的参数的具体类型,而是在类使用时再设置。

(2)语法:< >中的T被称为类型参数,用于指代任何类型。

class MyClass<T> {
    T t;
}

常见的大写字母代表类型参数

T:用在泛型类声明上,指代泛型类
E:一般用于属性
K,V:键值对

(3)当泛型类需要多个不同类型的变量时,< >以 , 分隔声明不同大写字母即可
class MyClass<T,E>

jdk1.7 钻石修饰符,后面的类型参数可以省 MyClass<String> myClass = new MyClass<>();

(4)泛型只能使用引用数据类型,基本类型用包装类

2.2 泛型方法

(1)语法:public <T> void testMethod(T t) {} 返回值前有 < T >

(2)泛型方法与泛型类没关系,普通类也可以有泛型方法

(3)泛型类与泛型方法可以共存。两者类型参数无关。
规范起见,两者共存时,使用不同类型参数来区分。

class MyClass<T> {
    //泛型类里的普通方法
    public T method1(T t) {
        return t;
    } 
    //泛型类例里的泛型方法
    public <E> E method2(E e) {
        return  t;
    }
}
public class Test {
    public static void main(String[] args) {
        MyClass<String> myClass = new MyClass<>();
        System.out.println(myClass.method1("呵呵呵"));
        System.out.println(myClass.method2(22223));
    }
}
2.3 通配符 - 解决泛型的参数统一化问题(重要)
2.3.1 ?通配符 - 作用于方法参数声明

public static void print(MyClass<?> myClass)

此时方法参数可以接受任意类型的Myclass对象

由于无法确定入参的类型,因此 ? 通配符下的泛型参数,只能取得类中属性值,无法进行属性值设置。

2.3.2 设置泛型上限 - 用于泛型类的声明,可也用于方法参数

泛型类声明:T extends 类

方法参数:? extends 类
eg:? extends Number: 表示入参只能接收Number及其子类

***** 方法参数设置泛型上限依然只能取得类中属性值,无法设置,因为设置父类值子类不一定能使用(父类不一定能向下转型变为子类)

2.3.3 设置泛型下限 -只能用于方法参数

?super 类 表示方法入参只能接受类以及其父类对象

方法参数设置泛型下限不仅可以取得类中属性值,还可以设置参数值,因为向上转型是安全的

2.4 泛型接口

(1)子类实现接口时继续保留泛型
class InterfaceImpl<T> implements IInterface<T>

(2)子类实现接口时就确定好类型
class InterfaceImpl implements IInterface<String>

interface IInterface<T> {
    T test(T t);
}
//1.子类实现接口时继续保留泛型
//class InterfaceImpl<T> implements IInterface<T>{
//    @Override
//    public T test(T t) {
//        return t;
//    }
//}
//2.子类实现接口时就确定好类型
class InterfaceImpl implements IInterface<String>{

    @Override
    public String test(String s) {
        return s;
    }
}
public class Test {
    public static void main(String[] args) {
     // 1.IInterface<String> iInterface = new InterfaceImpl<>();
      IInterface iInterface = new InterfaceImpl();
        System.out.println( iInterface.test("hiusi"));
    }
}
2.5********* 类型擦除(重要)*********

泛型信息仅存在代码编译阶段,进入JVM之前,与泛型类相关的信息会被擦除掉。

泛型类与普通类在JVM中没有区别。

泛型类进入JVM前会进行擦除,泛型类的类型参数如果没有指定类型上限,则擦除为Object类;如果类型参数指定上限,擦除为相应类型上限。
<T> ->Object
<T extends String> -> String

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值