Arrays and generics 数组和通用 不能建立对象的几种实现

来源:互联网 发布:工作备忘录 软件 编辑:程序博客网 时间:2024/05/22 15:56

一、建立一个普通数组对象(即建立一个袋子),可以用generics 通用 规定放什么,往里面放东西。

  建立一个普通对象数组,大小(10),内容没有(但是对于对象数组,内容一般是对象的地址)

       List[] la = new List[10];

  1、 意思:现在有个大袋子,谁都可以放东西,各种类型都可以,开始放东西

   1.1自己规定只能放String: List<String>[] ls;    第一人:放String.

         ls = (List<String>[]) la;

         ls[0] = new ArrayList<String>();

         ls[1] = new ArrayList<Integer>(); //出错,定义时就规定放String,所以编译器认为是错的。

   1.2 List<Integer>[] lt; 第二人:Integer。
       lt=la;// lt=ls;出错,因为List<Integer>[]和List<String>是不同类型。
       la[1]=new ArrayList<Integer>();

  1.3 Object[] objects = ls; 或是Object[] objects = la; 两语句都可以 // Object[] objects = ls; 编译时不出错,List<String>[])是Object[]的子类,即同一类型

     objects[2] = new ArrayList<Integer>();

 2、如果袋子放同一类型更简单:

     List<String>[] s1 = (List<String>[]) new List[10];
for (int i = 0; i < s1.length; i++)
s1[i] = new ArrayList<String>();

***结论: a generic container will virtually always be a better choice than an array of
generics:一个通用的容器比一个通用的数组更好。
例子:
package arrays;
import java.util.*;

public class ArrayOfGenerics {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<String>[] ls;
List<Integer>[] lt;
List[] la = new List[10];
ls = (List<String>[]) la; // "Unchecked" warning
ls[0] = new ArrayList<String>();
// Compile-time checking produces an error:
// ls[1] = new ArrayList<Integer>();
// The problem: List<String> is a subtype of Object
lt=la;
la[1]=new ArrayList<Integer>();
Object[] objects = ls; // So assignment is OK

// Compiles and runs without complaint:
objects[2] = new ArrayList<Integer>();

List<String>[] s1 = (List<String>[]) new List[10];
for (int i = 0; i < s1.length; i++)
s1[i] = new ArrayList<String>();
}
}

       Start  Length  Slot  Name   Signature
            0      67     0  args   [Ljava/lang/String;
            8      59     1    ls   [Ljava/util/List;
            6      61     2    la   [Ljava/util/List;
           20      47     3 objects   [Ljava/lang/Object;
           37      30     4 spheres   [Ljava/util/List;
           40      26     5     i 二、当方法参数里没有 传入 T时

 1、  类参数,<T> 丢失,

      1.1定义类成员没问题:T[] array; 

      1.2但是在构造函数里,就丢失了:! array = new T[size]; //出错,只是简单的建立对象和定义大小

         补救:array = (T[]) new Object[size]; // "unchecked" Warning

 2、方法参数,<U> 丢失。 

      public <U> U[] makeArray() { return new U[10]; }//编译器出错,

  package arrays;

public class ArrayOfGenericType<T> {
T[] array; // OK
    String[] array1;
@SuppressWarnings("unchecked")
public ArrayOfGenericType(int size) {
array1=new String[10];
// ! array = new T[size]; // Illegal
array = (T[]) new Object[size]; // "unchecked" Warning
}
// Illegal:
// ! public <U> U[] makeArray() { return new U[10]; }
public   static void main(String[] args)
  {
  ArrayOfGenericType<String> t1=new  ArrayOfGenericType<String>(10);
  String[] s=t1.array1;
  Object[] s1=t1.array;
  System.out.println("saga"+s);
  System.out.print("saga"+s1);
  }
}



阅读全文
0 0