1.所谓泛型(Grenerics)是指在对象建立的时候不指定具体的类型而是在申明和实例化对象的时候指定具体的类型;
2.需要泛型最重的因素有两点:第一,包容各种类型的变化,第二,框架基于泛型能够“容易”,例如hadoop和Spark都大量使用了泛型
3.泛型类:
public class JavaGenerics {
public static void main(String[] args){
Empty<String> empty = null;
empty = new Empty<String>("Spark");
System.out.println("Content :"+empty.getItem());
}
}
class Empty<T>{
private T item;
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
public Empty(T item) {
this.item = item;
}
}
4.“?”表示任意的类型
private static void log(Empty<? extends String, ? extends Number> empty) {
System.out.println(empty.getKey() +" "+empty.getValue());
}
5.泛型的上限:限定具体泛型的范围,使用类型的extends关键字来限定
class Empty<K extends String,V extends Number> {
private K key;
private V value;
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
public Empty(K key, V value) {
this.key = key;
this.value = value;
}
}
6.泛型下限:限定具体泛型向下的范围,使用super关键字来限定;
7.泛型接口:
public class javaGenerics {
public static void main(String[] args){
ITNews<String> itNews = new ITNews<>("Spark is Faster");
}
interface News<T>{
public T getContent();
}
class ITNews<T> implements News<T>{
private T content;
public ITNews(T spark_is_faster) {
this.content = spark_is_faster;
}
public void setContent(T content) {
this.content = content;
}
@Override
public T getContent(){
return content;
}
}
public class JavaGenerics {
public static void main(String[] args){
Integer[] data = {1,2,3,4,5,6,7};
arrayGenerics(data);
}
private static <T> void arrayGenerics(T[] data) {
for (T item : data){
System.out.println(item);
}
}