一、建立一个普通数组对象(即建立一个袋子),可以用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 |
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); } } |