多個(gè)java泛型示例分享
1.泛型類
1.1普通泛型
package test.lujianing;
/**
* 泛型類
* @param <T>
*/
class Test<T>{
private T obj;
public void setValue(T obj){
this.obj =obj;
}
public T getValue(){
System.out.println(obj.getClass().getName());
return obj;
}
}
/**
* 測(cè)試泛型類
*/
public class TestOne {
public static void main(String[] args) {
//測(cè)試Integer泛型
Test<Integer> t1 = new Test<Integer>();
t1.setValue(5);
Integer i = t1.getValue();
System.out.println(i);
//測(cè)試Double泛型
Test<Double> t2 = new Test<Double>();
t2.setValue(5.55D);
Double d = t2.getValue();
System.out.println(d);
//測(cè)試String泛型
Test<String> t3 = new Test<String>();
t3.setValue("hello world");
String str =t3.getValue();
System.out.println(str);
}
}
輸出結(jié)果:
java.lang.Integer
5
java.lang.Double
5.55
java.lang.String
hello world
1.2 K/V泛型
package test.lujianing;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Administrator on 14-3-30.
*/
class TestKV<K,V>{
private Map<K,V> map=new HashMap<K, V>();
public void put(K k, V v) {
map.put(k,v);
}
public V get(K k) {
return map.get(k);
}
}
public class TestFour{
public static void main(String[] args) {
TestKV<String,String> t = new TestKV<String, String>();
t.put("name","jianing");
System.out.println(t.get("name"));
TestKV<String,Integer> t2 = new TestKV<String, Integer>();
t2.put("age",24);
System.out.println(t2.get("age"));
}
}
輸出結(jié)果:
jianing
24
2.泛型接口
package test.lujianing;
/**
* 泛型接口
* @param <T>
*/
public interface TestImpl<T> {
public void setValue(T t);
public T getValue();
}
輸出結(jié)果:
1
hello word
3.泛型方法
package test.lujianing;
/**
* 泛型方法類
*/
class TestMethod{
/**
* 泛型方法
*/
public <T>T getValue(Object s,Class<T> clazz) {
System.out.println(clazz.getName());
T t =null;
if(clazz.getName().equals("java.lang.Integer")){
Double d = Double.parseDouble(s.toString());
int i =d.intValue();
t=(T)new Integer(i);
}
if(clazz.getName().equals("java.lang.Double")){
t=(T)new Double(s.toString());
}
return t;
}
}
/**
* 泛型方法測(cè)試類
*/
public class TestThree {
public static void main(String[] args) {
TestMethod t = new TestMethod();
int i =t.getValue("30.0011",Integer.class);
System.out.println(i);
double d =t.getValue("40.0022",Double.class);
System.out.println(d);
}
}
輸出結(jié)果:
java.lang.Integer
30
java.lang.Double
40.0022
4.限制泛型
在上面的例子中,沒(méi)有限制class Test<T>類型持有者T的范圍,默認(rèn)限定類型相當(dāng)于Object。比如我們要限制T為數(shù)字接口類型。只需要這么做:class Test<T extends Number>,這樣類中的泛型T只能是Number接口的實(shí)現(xiàn)類,傳入非Number接口編譯會(huì)出錯(cuò)。
5.通配泛型
package test.lujianing;
import java.util.HashMap;
import java.util.Map;
/**
* 通配泛型
*/
public class TestFive {
public static void main(String[] args) {
Map<String,Class<? extends Number>> map = new HashMap<String,Class<? extends Number>>();
map.put("Integer",Integer.class);
map.put("Double",Double.class);
for (Map.Entry<String,Class<? extends Number>> entry : map.entrySet()) {
System.out.println("key:" + entry.getKey() + " value:" + entry.getValue());
}
}
}
輸出結(jié)果:
key:Double value:class java.lang.Double
key:Integer value:class java.lang.Integer
簡(jiǎn)單的例子:針對(duì)1.1的例子
public static void main(String[] args) {
//測(cè)試Integer泛型
Test<Integer> t1 = new Test<Integer>();
t1.setValue(5);
fun(t1);
//測(cè)試Double泛型
Test<Double> t2 = new Test<Double>();
t2.setValue(5.55D);
fun(t2);
}
public static void fun(Test<?> t){
System.out.println("通配泛型"+t.getValue());
}
輸出結(jié)果:
java.lang.Integer
通配泛型5
java.lang.Double
通配泛型5.55
6.補(bǔ)充
在泛型中,可能會(huì)遇到<T><E>等,T和E分別是Type和Element的首字母。E一般用來(lái)表示集合類型中的元素的類型,例如List接口的定義,public interface List<E> extends Collection<E>。這只是一種命名習(xí)慣,兩者沒(méi)有本質(zhì)區(qū)別。
相關(guān)文章
Java實(shí)現(xiàn)發(fā)送手機(jī)短信語(yǔ)音驗(yàn)證功能代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)發(fā)送手機(jī)短信語(yǔ)音驗(yàn)證功能代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09Mabitis中的#與$符號(hào)區(qū)別及用法介紹
這篇文章主要介紹了Mabitis中的#與$符號(hào)區(qū)別,需要的朋友可以參考下2017-02-02spring?retry方法調(diào)用失敗重試機(jī)制示例解析
這篇文章主要為大家介紹了spring?retry方法調(diào)用失敗重試機(jī)制的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Netty分布式Future與Promise執(zhí)行回調(diào)相關(guān)邏輯剖析
這篇文章主要為大家介紹了Netty分布式Future與Promise執(zhí)行回調(diào)相關(guān)邏輯剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03淺析Java中comparator接口與Comparable接口的區(qū)別
本文要來(lái)詳細(xì)分析一下Java中Comparable和Comparator接口的區(qū)別,兩者都有比較的功能,那么究竟有什么區(qū)別呢,感興趣的Java開(kāi)發(fā)者繼續(xù)看下去吧2016-10-10Spring 面向切面編程AOP實(shí)現(xiàn)詳解
這篇文章主要介紹了Spring 面向切面編程AOP實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09java 中使用maven shade plugin 打可執(zhí)行Jar包
這篇文章主要介紹了java 中使用maven shade plugin 打可執(zhí)行Jar包的相關(guān)資料,需要的朋友可以參考下2017-05-05logback如何去掉DubboMonitor煩人的INFO日志
這篇文章主要介紹了logback如何去掉DubboMonitor煩人的INFO日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07