最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java泛型學習示例

 更新時間:2014年04月29日 10:35:05   作者:  
Java泛型(Generics)是JDK5開始引入的一個新特性,允許在定義類和接口的時候使用類型參數(Type Parameter)。下面是學習泛型的示例

Java泛型(Generics)是JDK5開始引入的一個新特性,允許在定義類和接口的時候使用類型參數(Type Parameter)。聲明的類型參數在使用時用具體的類型來替換,現在泛型最主要的應用是在JDK5中的新集合類框架中,Map, List均有用到。其中的優(yōu)點不言而喻,我們可以橫向擴展更多的類,缺點呢,其實也就是他的優(yōu)點,因為這需要我們在使用泛型類的時候,要很清楚自己的代碼目地,不能使用錯誤的類型。

最基本的泛型類

復制代碼 代碼如下:

package com.garinzhang.javabase.generic.e1;

/**

* 最基本的泛型類,類型由自己定義

* @author Garin Zhang

*

* @param <T>

*/

public class Point<T> {

private T var;

public T getVar() {

return var;

}

public void setVar(T var) {

this.var = var;

}

}

package com.garinzhang.javabase.generic.e1;

public class GenericExample {

/**

* @param args

*/

public static void main(String[] args) {

Point<String> p = new Point<String> ();

p.setVar("coder");

System.out.println(p.getVar());

}

}

多個泛型類型

復制代碼 代碼如下:

package com.garinzhang.javabase.generic.e2;

/**

* 多個泛型類型,一般多個最好是以靠近T的字母,如S,R等

* @author Garin Zhang

*

* @param <T>

* @param <S>

*/

public class Notepad<T, S> {

private T key;

private S value;

public T getKey() {

return this.key;

}

public S getValue() {

return this.value;

}

public void setKey(T key) {

this.key = key;

}

public void setValue(S value) {

this.value = value;

}

}

package com.garinzhang.javabase.generic.e2;

public class GenericExample {

/**

* @param args

*/

public static void main(String[] args) {

Notepad<String, Integer> p = new Notepad<String, Integer> ();

p.setKey("coder");

p.setValue(99999);

System.out.println("key: " + p.getKey());

System.out.println("value: " + p.getValue());

}

}

在方法參數中使用通配符"?"

復制代碼 代碼如下:

package com.garinzhang.javabase.generic.e3;

/**

* 該例子關鍵在main方法里

* @author Garin Zhang

*

* @param <T>

*/

public class Info<T> {

private T key;

public T getKey() {

return this.key;

}

public void setKey(T key) {

this.key = key;

}

@Override

public String toString() {

return this.key.toString();

}

}

package com.garinzhang.javabase.generic.e3;

/**

* 在方法參數中使用通配符

* @author Garin Zhang

*

*/

public class GenericExample {

/**

* @param args

*/

public static void main(String[] args) {

Info<String> i = new Info<String>();

i.setKey("coder");

fun(i);

Info<Integer> j = new Info<Integer>();

j.setKey(9999);

fun(j);

}

public static void fun(Info<?> temp) {

System.out.println("Content: " + temp);

}

}

向上轉型失敗

復制代碼 代碼如下:

package com.garinzhang.javabase.generic.e4;

/**

* 該例子關鍵在main方法里

* @author Garin Zhang

*

* @param <T>

*/

public class Info<T> {

private T key;

public T getKey() {

return this.key;

}

public void setKey(T key) {

this.key = key;

}

@Override

public String toString() {

return this.key.toString();

}

}

package com.garinzhang.javabase.generic.e4;

public class GenericExample {

/**

* @param args

*/

public static void main(String[] args) {

Info<String> strEg = new Info<String>();

Info<Object> objEg;

// 編譯錯誤"Type mismatch: cannot convert from Info<String> to Info<Object>"

// 向上轉型失敗,String -> Object

// objEg = strEg;

}

}



泛型在接口中的使用

復制代碼 代碼如下:

package com.garinzhang.javabase.generic.e5;

/**

* 該例子關鍵在main方法里

* @author Garin Zhang

*

* @param <T>

*/

interface Info<T> {

public T getVar();

}

package com.garinzhang.javabase.generic.e5;

/**

* 泛型類

* @author Garin Zhang

*

* @param <T>

*/

public class InfoImpl<T> implements Info<T> {

private T var;

public InfoImpl(T var) {

this.setVar(var);

}

public void setVar(T var) {

this.var = var;

}

public T getVar() {

return this.var;

}

}

package com.garinzhang.javabase.generic.e5;

/**

* 非泛型類

* @author Garin Zhang

*

* @param <T>

*/

public class InfoImpl1 implements Info<String> {

private String var;

public InfoImpl1(String var) {

this.setVar(var);

}

public void setVar(String var) {

this.var = var;

}

public String getVar() {

return this.var;

}

}

package com.garinzhang.javabase.generic.e5;

public class GenericExample {

/**

* @param args

*/

public static void main(String[] args) {

Info<String> strEg = new InfoImpl<String>("coder");

System.out.println("Content: " + strEg.getVar());

Info<String> strEg1 = new InfoImpl1("coder1");

System.out.println("Content: " + strEg1.getVar());

}

}

通配符和extends, super的使用

復制代碼 代碼如下:

package com.garinzhang.javabase.generic.e6;

/**

* 該例子關鍵在main方法里

* @author Garin Zhang

*

* @param <T>

*/

public class Info<T> {

private T key;

public T getKey() {

return this.key;

}

public void setKey(T key) {

this.key = key;

}

@Override

public String toString() {

return this.key.toString();

}

}

package com.garinzhang.javabase.generic.e6;

public class GenericExample {

/**

* @param args

*/

public static void main(String[] args) {

Info<String> strEg = new Info<String>();

strEg.setKey("coder");

// 編譯報錯"The method fun(Info<? extends Number>) in the type GenericExample is not applicable for the arguments (Info<String>)"

// upTypeLimit(i);

// 使用Integer,Number類型均可以

Info<Integer> intEg = new Info<Integer>();

intEg.setKey(9999);

upTypeLimit(intEg);

// 編譯報錯"The method downTypeLimit(Info<? super String>) in the type GenericExample is not applicable for the arguments (Info<Integer>)"

// downTypeLimit(intEg);

 

// 由于使用的是super,downTypeLimit只能接收String本身和Object

// 查看了String的繼承關系,沒有繼承其他類,只有Object

downTypeLimit(strEg);

 

Info<Object> objEg = new Info<Object>();

objEg.setKey(999);

downTypeLimit(objEg);

}

/**

* <? extends T> 表示類型的上界,表示參數化類型的可能是T 或是 T的子類

* @param temp

*/

public static void upTypeLimit(Info<? extends Number> temp) {

System.out.println("Content: " + temp);

}

 

/**

* <? super T> 表示類型下界(Java Core中叫超類型限定),表示參數化類型是此類型的超類型(父類型),直至Object

* 在此例中,表示T只能為Object或String,因為String只繼承于Object

* @param temp

*/

public static void downTypeLimit(Info<? super String> temp) {

System.out.println("Content: " + temp);

}

}

 

方法泛型,方法里面多個泛型

復制代碼 代碼如下:

package com.garinzhang.javabase.generic.e7;

/**

* 方法泛型,方法里面多個泛型

* @author Garin Zhang

*

* @param <T>

*/

public class Info {

/**

* 格式:方法修飾付 <以逗號隔開的類型列表>返回值類型方法名(參數列表)

* 例如:public <T, S> T fun(T t, S s)

* @param t

* @param s

* @return

*/

public <T, S> T fun(T t, S s) {

System.out.println(s.toString());

return t;

}

}

package com.garinzhang.javabase.generic.e7;

public class GenericExample {

/**

* @param args

*/

public static void main(String[] args) {

Info info = new Info();

String str = info.fun("coder", "print second generic param");

System.out.println(str);

 

int i = info.fun(30, "print second param again");

System.out.println(i);

}

}

方法中傳入或返回的泛型類型由調用方法時所設置的參數類型決定

復制代碼 代碼如下:

package com.garinzhang.javabase.generic.e8;

/**

* extends

* @author Garin Zhang

*

* @param <T>

*/

public class Info<T extends Number> {

private T var;

public T getVar() {

return this.var;

}

public void setVar(T var) {

this.var = var;

}

@Override

public String toString() {

return this.var.toString();

}

}

package com.garinzhang.javabase.generic.e8;

public class GenericExample {

/**

* @param args

*/

public static void main(String[] args) {

Info<Integer> intEg = fun(30); // 這里類型已經確定為Integer

System.out.println(intEg.getVar());

}

/**

* 方法中傳入或返回的泛型類型由調用方法時所設置的參數類型決定

* @param param

* @return

*/

public static <T extends Number> Info<T> fun(T param) {

Info<T> temp = new Info<T>();

temp.setVar(param);

return temp;

}

}

讓方法中傳入兩個參數類型保持一致

復制代碼 代碼如下:

package com.garinzhang.javabase.generic.e9;

/**

* 查看main

* @author Garin Zhang

*

* @param <T>

*/

public class Info<T> {

private T var;

public T getVar() {

return this.var;

}

public void setVar(T var) {

this.var = var;

}

@Override

public String toString() {

return this.var.toString();

}

}

package com.garinzhang.javabase.generic.e9;

public class GenericExample {

/**

* @param args

*/

public static void main(String[] args) {

Info<String> i1 = new Info<String>();

i1.setVar("Hello");

 

Info<String> i2 = new Info<String>();

i2.setVar("Coder");

 

Info<Integer> i3 = new Info<Integer>();

i3.setVar(999);

 

add(i1, i2);

 

//編譯錯誤"The method add(Info<T>, Info<T>) in the type GenericExample is not applicable for the arguments (Info<String>, Info<Integer>)"

// add(i1, i3);

}

/**

* 方法中傳入兩個參數類型必須一致

* @param param

* @return

*/

public static <T> void add(Info<T> i1, Info<T> i2) {

System.out.println(i1.getVar() + ":" + i2.getVar());

}

}

泛型,可變參數,類似于javascript里的Arguments對象

復制代碼 代碼如下:

package com.garinzhang.javabase.generic.e10;

public class GenericExample {

/**

* @param args

*/

public static void main(String[] args) {

Integer i[] = fun(1, 2, 3, 4, 5, 6);

fun2(i);

}

public static <T> T[] fun(T... arg) {

return arg;

}

public static <T> void fun2(T param[]) {

System.out.println("generic array: ");

for(T t : param) {

System.out.println(t + " ,");

}

}

}



泛型嵌套:使用泛型類做為參數;根據返回值類型確定返回值
復制代碼 代碼如下:

package com.garinzhang.javabase.generic.e11;

/**

* 接受兩個泛型類型

* @author Garin Zhang

*

* @param <T>

*/

public class Info<T, V> {

private T var;

private V value;

 

public T getVar() {

return this.var;

}

public void setVar(T var) {

this.var = var;

}

 

public V getValue(){

return this.value;

}

public void setValue(V value) {

this.value = value;

}

@Override

public String toString() {

return this.var.toString();

}

}

package com.garinzhang.javabase.generic.e11;

/**

* 接受1個泛型類型

* @author Garin Zhang

*

* @param <T>

*/

public class Demo<S> {

private S info;

public Demo(S info) {

this.setInfo(info);

}

public void setInfo(S info) {

this.info = info;

}

public S getInfo() {

return this.info;

}

}

package com.garinzhang.javabase.generic.e11;

import java.util.List;

import com.google.common.collect.Lists;

public class GenericExample {

/**

* @param args

*/

public static void main(String[] args) {

Demo<Info<String, Integer>> d;

Info<String, Integer> i;

i = new Info<String, Integer>();

i.setVar("Coder");

i.setValue(999);

d = new Demo<Info<String,Integer>>(i);

System.out.println("Content: " + d.getInfo().getVar());

System.out.println("Content: " + d.getInfo().getValue());

System.out.println(query(1, 2, 3, 4, 5).toString()); // [1, 2, 3, 4, 5]

// 警告"Type safety: A generic array of Object&Comparable<?>&Serializable is created for a varargs parameter"

System.out.println(query(1, 2, 3, "StringType").toString()); // [1, 2, 3, StringType]

System.out.println(query("I ", "am ", "a ", "coder").toString());// [I , am , a , coder]

 

List<String> list = Lists.newArrayList("I ", "am ", "a ", "coder");

System.out.println(list.toString()); // [I , am , a , coder]

}

/**

* 通過返回值確定泛型類型,這個方法里面的返回值類型,是由方法的定義自動生成的

* @param elements

* @return

*/

public static <E> List<E> query(E... elements) {

// https://github.com/exitsoft/exit-web-framework/commit/1d2f1098a2a4b6abab175b793e2308aa8bd0ea16.

// import com.google.common.collect.Lists;

// <dependency>

// <groupId>com.google.guava</groupId>

// <artifactId>guava</artifactId>

// <version>16.0.1</version>

// </dependency>

return Lists.newArrayList(elements);

}

}

相關文章

  • IntelliJ?IDEA?2022.1.1?沒有CVS的過程分析

    IntelliJ?IDEA?2022.1.1?沒有CVS的過程分析

    這篇文章主要介紹了IntelliJ?IDEA?2022.1.1?沒有CVS的過程解析,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Java NIO實戰(zhàn)之聊天室功能詳解

    Java NIO實戰(zhàn)之聊天室功能詳解

    這篇文章主要介紹了Java NIO實戰(zhàn)之聊天室功能,結合實例形式詳細分析了java NIO聊天室具體的服務端、客戶端相關實現方法與操作注意事項,需要的朋友可以參考下
    2019-11-11
  • 簡單介紹線性表以及如何實現雙鏈表

    簡單介紹線性表以及如何實現雙鏈表

    本文先介紹線性表的幾個基本組成部分:數組、單向鏈表、雙向鏈表;隨后給出雙向鏈表的C、C++和Java三種語言的實現,需要的朋友可以參考下
    2015-07-07
  • Java動態(tài)代理模式的深入揭秘

    Java動態(tài)代理模式的深入揭秘

    這篇文章主要給大家介紹了關于Java動態(tài)代理模式的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • SpringBoot?Schedule調度任務的動態(tài)管理

    SpringBoot?Schedule調度任務的動態(tài)管理

    Scheduled定時任務是Spring?boot自身提供的功能,所以不需要引入Maven依賴包,下面這篇文章主要給大家介紹了關于SpringBoot通過@Scheduled實現定時任務以及問題解決的相關資料,需要的朋友可以參考下
    2023-02-02
  • Spring5路徑匹配器PathPattern解析

    Spring5路徑匹配器PathPattern解析

    這篇文章主要介紹了Spring5路徑匹配器PathPattern,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 修改SpringBoot啟動圖標banner的兩種方式

    修改SpringBoot啟動圖標banner的兩種方式

    Banner即橫幅標語,我們在啟動SpringBoot項目時會將Banner信息打印至控制臺,我們可以輸出一些圖形、SpringBoot版本信息等內容,有很多小伙伴想知道如何修改SpringBoot啟動圖標banner,接下來由小編給大家介紹一下吧
    2024-08-08
  • Java表數據導出到Excel中的實現

    Java表數據導出到Excel中的實現

    這篇文章主要介紹了Java表數據導出到Excel中的實現,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Java中equals()方法實例詳解

    Java中equals()方法實例詳解

    equals方法是java.lang.Object類的方法,下面這篇文章主要給大家介紹了關于Java中equals()方法的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-12-12
  • Java如何將字符串String轉換為整型Int

    Java如何將字符串String轉換為整型Int

    這篇文章主要介紹了Java如何將字符串String轉換為整型Int,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08

最新評論

富蕴县| 泗水县| 淅川县| 康乐县| 安溪县| 宁明县| 赫章县| 甘孜| 津市市| 醴陵市| 新乡市| 乾安县| 温宿县| 高州市| 通榆县| 莆田市| 仲巴县| 兰州市| 股票| 关岭| 安阳市| 荔波县| 通化县| 昌都县| 沾化县| 英吉沙县| 呼和浩特市| 大连市| 科尔| 三门县| 建水县| 清河县| 和林格尔县| 新乐市| 稷山县| 正宁县| 彰化市| 宜阳县| 宝兴县| 沭阳县| 锡林郭勒盟|