码迷,mamicode.com
首页 > 编程语言 > 详细

《Java架构筑基》从Java基础讲起——泛型的限制

时间:2019-12-27 11:30:52      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:ble   类型擦除   实例化   类型兼容   对象   java基础   基础   写法   方法   

一. 模糊性错误

对泛型类 User< T, K > 而言,声明了两个泛型类参数:T 和 K。在类中试图根据类型参数的不同重载 set() 方法。这看起来没什么问题,可编译器会报错

public class User<T, K> {
    //重载错误
    public void set(T t) {
    }
    //重载错误
    public void set(K k) {
    }
}

首先,当声明 User 对象时,T 和 K 实际上不需要一定是不同的类型,以下的两种写法都是正确的

public class GenericMain {
    public static void main(String[] args) {
        User<String, Integer> stringIntegerUser = new User<>();
        User<String, String> stringStringUser = new User<>();
    }
}

对于第二种情况,T 和 K 都将被 String 替换,这使得 set() 方法的两个版本完全相同,所以会导致重载失败。

此外,对 set() 方法的类型擦除会使两个版本都变为如下形式:

一样会导致重载失败

public void set(Object o) {
}

二. 不能实例化类型参数

不能创建类型参数的实例。因为编译器不知道创建哪种类型的对象,T 只是一个占位符

public class User<T> {
    private T t;
    public User() {
        //错误
        t = new T();
    }
}

三.对静态成员的限制

静态成员不能使用在类中声明的类型参数,但是可以声明静态的泛型方法

public class User<T> {
    //错误
    private static T t;
    //错误
    public static T getT() {
        return t;
    }
    //正确
    public static <K> void test(K k) {
    }
}

四. 对泛型数组的限制

不能实例化元素类型为类型参数的数组,但是可以将数组指向类型兼容的数组的引用

public class User<T> {
    private T[] values;
    public User(T[] values) {
        //错误,不能实例化元素类型为类型参数的数组
        this.values = new T[5];
        //正确,可以将values 指向类型兼容的数组的引用
        this.values = values;
    }
}

此外,不能创建特定类型的泛型引用数组,但使用通配符的话可以创建指向泛型类型的引用的数组

public class User<T> {
    private T[] values;
    public User(T[] values) {
        this.values = values;
    }
}
public class GenericMain {
    public static void main(String[] args) {
        //错误,不能创建特定类型的泛型引用数组
        User<String>[] stringUsers = new User<>[10];
        //正确,使用通配符的话,可以创建指向泛型类型的引用的数组
        User<?>[] users = new User<?>[10];
    }
}

五. 对泛型异常的限制

泛型类不能扩展 Throwable,意味着不能创建泛型异常类

《Java架构筑基》从Java基础讲起——泛型的限制

标签:ble   类型擦除   实例化   类型兼容   对象   java基础   基础   写法   方法   

原文地址:https://blog.51cto.com/14637764/2462215

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!