generic paradigm
A disadvantage of Java collections is that if an object is dropped into a collection, the collection will forget the data type of the object, and the type of the object will become an Object type. The Java collection is designed so that the designer of the collection does not know what the type of storage is to be, so that the universal design is Obejct.
In order to solve this problem, the concept of generics is designed. Generics are those that specify the type of a collection when it is created.
1. Use of generics
import java.util.ArrayList; import java.util.List; public class GenericList { public static void main(String[] args) { //The act of specifying the type of collection when creating a collection is generic. List<String> strList =new ArrayList<String>(); strList.add("aaaa"); strList.add("bbbb"); strList.add("cccc"); strList.add("ddddd"); // strList.add(23); strList.forEach(str->System.out.println(str.length())); } }
2. Java 7 generic diamond statements
The data type behind the diamond syntax in Java 7 can be omitted and the system automatically determines the data type.
For example: List books = new ArrayList <>();
3. Define generic classes and generic interfaces
public class Apple<T> { // Define instance variables with parameters of type T private T info; public Apple() { } public Apple(T info) { this.info=info; } public T getInfo() { return info; } public void setInfo(T info) { this.info = info; } public static void main(String[] args) { Apple<String> al =new Apple<String>("Apple"); System.out.println(al.getInfo()); Apple<Double> a2 =new Apple<>(3.21); System.out.println(a2.getInfo()); } }
4. Derivation of subclasses from generic classes
public class DemoA<T> extends Apple<T> { //Subclasses inherit generic parent classes that need to specify data types or continue to use generics @Override public T getInfo() { return super.getInfo(); } } public class DemoB extends Apple<String> { @Override public String getInfo() { return "Subclass"+super.getInfo(); } }
5. Generic Approach
import java.util.ArrayList; import java.util.Collection; public class GenericMethodTest { //Store data in an array into a collection public static void fromArrayToCollection(Object [] arr,Collection<Object> coll) { for (Object obj : arr) { coll.add(obj); } } //Using generics to implement the functions described below is a generic approach public static <T> void fromArrayToCollectionGeneric(T [] arr,Collection<T> coll) { for(T o:arr) { coll.add(o); } } public static void main(String[] args) { Object [] oa =new Object[100]; Collection<Object> co =new ArrayList<>(); fromArrayToCollection(oa,co); //The following code T represents the Object type fromArrayToCollectionGeneric(oa,co); String [] sa =new String[100]; Collection<String> cs =new ArrayList<>(); //The following code T represents the String type fromArrayToCollectionGeneric(sa,cs); Integer [] ia =new Integer[100]; Float [] fa =new Float[100]; Number [] na =new Number[100]; Collection<Number> cn =new ArrayList<>(); //The following code T represents Number type fromArrayToCollectionGeneric(ia,cn); fromArrayToCollectionGeneric(fa,cn); //The following code T represents the Object type fromArrayToCollectionGeneric(na,co); //The following code reports errors, where T represents String type and na is NUmber type, not a subclass of String, so the error is reported // fromArrayToCollectionGeneric(na,cs); } }
6. Generic Erasion and Conversion
Generics in Java are pseudo-generics, which are valid only at compile time and do not exist at run time.
When an object with generic information is assigned to another variable without generic information, all type information between pointed brackets is thrown away.
public static void main(String[] args) { Apple<Integer> a =new Apple<Integer>(6); //as will get the collection size Integer as =a.getSize(); //Assigning an object a to the apple variable b will lose the type information in angle brackets Apple b=a; //b Just getSize returns a Number type, so no error is reported. Number as2=b.getSize(); //The following code will report errors because the data type is missing from assigning b. // Integer as3 =b.getSize(); }