账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    java 泛型问题?
    16
    0
    public class Plate<T> {
        private T   item;
        public Plate(T t){
            item=t;
        }
        public  void set(T t){
            item=t;
        }
    
        public T get(){
            return item;
        }
    
        public static void main(String[] args) {
            Plate<String> [] arr=new Plate[10];
            //Plate<String> [] arr2=new Plate<>[10];//编译错误
            Plate<Integer> plate=new Plate<>(1);
            Object[] arr1=arr;
            arr1[0]=plate;
            String a=arr[0].get();
        }
    }
    

    请问为什么

    Plate<String> [] arr=new Plate[10]

    不报错,而

    Plate<String> [] arr2=new Plate<>[10]

    编译错误,

    这两语句有什么不同?

    -------------------------------后续补充--------------------------------

    关于

    in generics instantiation of arrays of parametrized types are illegal.

    我是这样理解的,以一个例子说明一下:

    static void test() { 
      Pair<Integer,Integer>[] intPairArr = new Pair<Integer,Integer>[10] ; // error 
      addElements(intPairArr);  
      Pair<Integer,Integer> pair = intPairArr[1]; 
      Integer i = pair.getFirst(); 
      pair.setSecond(i); 
    } 
    static void addElements( Object[] objArr) { 
      objArr[0] = new Pair<Integer,Integer>(0,0); 
      objArr[1] = new Pair<String,String>("","");      // should fail with ArrayStoreException 
    }

    倘若支持,则我们调用addElements方法时,将其向上转型为Object[](数组支持协变,故编译通过),则继续添加元素时,则会编译通过,这样在运行时会出现arrayStoreException,Java引入泛型其中很重要的一点就是为了安全,将运行时的异常在编译时就暴漏出来,避免出现由于数组支持协变而导致的一些异常在编译期间无法发现,可以说,不支持泛型对象数组的创建就是因为数组有协变这一特性。

    而答案中所说到的关于Java不支持泛型数组很好理解,举例说明:

     T [] arr=new T[10];

    这里我们假设T为String,由于Java的泛型采用擦除机制,只作用于编译时,编译之后则T都转化为Object,实际上创建的都是Object数组,则通过桥接方法转化为String时,则明显不对,故不支持泛型数组的创建。

    我们可以通过迂回的方式来创建泛型数组,举例说明:

        public T[] createArray(T[] arr){
            T[] array= (T[]) new Object[arr.length];
            for (int i = 0; i <arr.length ; i++) {
                array[i]=arr[i];
            }
            return  array;
        }

    实际上将传入的泛型数组copy到对应的Object数组中了。

    最后一个问题,什么原因导致了Java支持数组协变这一可能出现问题的特性呢?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • AI智能解答 超级管理员 2023-04-06 12:091楼
      Java 泛型是指在 Java 中使用参数化类型的一种机制,它允许程序员在编译时期检查类型安全,并且可以在运行时期提供更强大的类型安全性。它可以让程序员在编写代码时使用更加抽象的概念,从而提高代码的可读性和可维护性。
    • AI智能解答 超级管理员 2023-04-06 12:082楼
      Java 泛型是指在 Java 中使用参数化类型的一种机制,它允许程序员在编译时期检查类型安全,并且可以使用类型参数来创建可重用的组件,以便在多个类型之间重用代码。它还可以用来提高程序的可读性和可维护性。
    • AI智能解答 超级管理员 2023-04-06 12:063楼
      Java 泛型是指在 Java 中使用参数化类型的一种机制,它允许程序员在编译时期检查类型安全,并且可以在运行时期提供更强大的类型安全性。它可以让程序员在编写代码时使用更加抽象的概念,从而提高代码的可读性和可维护性。
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部