栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java泛型学习示例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java泛型学习示例

Java泛型(Generics)是JDK5开始引入的一个新特性,允许在定义类和接口的时候使用类型参数(Type Parameter)。声明的类型参数在使用时用具体的类型来替换,现在泛型最主要的应用是在JDK5中的新集合类框架中,Map, List均有用到。其中的优点不言而喻,我们可以横向扩展更多的类,缺点呢,其实也就是他的优点,因为这需要我们在使用泛型类的时候,要很清楚自己的代码目地,不能使用错误的类型。

最基本的泛型类
复制代码 代码如下:
package com.garinzhang.javabase.generic.e1;

public class Point {

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 {

public static void main(String[] args) {

Point p = new Point ();

p.setVar("coder");

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

}

}

多个泛型类型
复制代码 代码如下:
package com.garinzhang.javabase.generic.e2;

public class Notepad {

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 {

public static void main(String[] args) {

Notepad p = new Notepad ();

p.setKey("coder");

p.setValue(99999);

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

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

}

}

在方法参数中使用通配符"?"
复制代码 代码如下:
package com.garinzhang.javabase.generic.e3;

public class Info {

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;

public class GenericExample {

public static void main(String[] args) {

Info i = new Info();

i.setKey("coder");

fun(i);

Info j = new Info();

j.setKey(9999);

fun(j);

}

public static void fun(Info temp) {

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

}

}

向上转型失败
复制代码 代码如下:
package com.garinzhang.javabase.generic.e4;

public class Info {

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 {

public static void main(String[] args) {

Info strEg = new Info();

Info objEg;

// 编译错误"Type mismatch: cannot convert from Info to Info"

// 向上转型失败,String -> Object

// objEg = strEg;

}

}


泛型在接口中的使用

复制代码 代码如下:
package com.garinzhang.javabase.generic.e5;

interface Info {

public T getVar();

}

package com.garinzhang.javabase.generic.e5;

public class InfoImpl implements Info {

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;

public class InfoImpl1 implements Info {

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 {

public static void main(String[] args) {

Info strEg = new InfoImpl("coder");

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

Info strEg1 = new InfoImpl1("coder1");

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

}

}

通配符和extends, super的使用
复制代码 代码如下:
package com.garinzhang.javabase.generic.e6;

public class Info {

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 {

public static void main(String[] args) {

Info strEg = new Info();

strEg.setKey("coder");

// 编译报错"The method fun(Info) in the type GenericExample is not applicable for the arguments (Info)"

// upTypeLimit(i);

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

Info intEg = new Info();

intEg.setKey(9999);

upTypeLimit(intEg);

// 编译报错"The method downTypeLimit(Info) in the type GenericExample is not applicable for the arguments (Info)"

// downTypeLimit(intEg);

 

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

// 查看了String的继承关系,没有继承其他类,只有Object

downTypeLimit(strEg);

 

Info objEg = new Info();

objEg.setKey(999);

downTypeLimit(objEg);

}

public static void upTypeLimit(Info temp) {

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

}

 

public static void downTypeLimit(Info temp) {

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

}

}

 

方法泛型,方法里面多个泛型
复制代码 代码如下:
package com.garinzhang.javabase.generic.e7;

public class Info {

public T fun(T t, S s) {

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

return t;

}

}

package com.garinzhang.javabase.generic.e7;

public class GenericExample {

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;

public class Info {

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 {

public static void main(String[] args) {

Info intEg = fun(30); // 这里类型已经确定为Integer

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

}

public static Info fun(T param) {

Info temp = new Info();

temp.setVar(param);

return temp;

}

}

让方法中传入两个参数类型保持一致
复制代码 代码如下:
package com.garinzhang.javabase.generic.e9;

public class Info {

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 {

public static void main(String[] args) {

Info i1 = new Info();

i1.setVar("Hello");

 

Info i2 = new Info();

i2.setVar("Coder");

 

Info i3 = new Info();

i3.setVar(999);

 

add(i1, i2);

 

//编译错误"The method add(Info, Info) in the type GenericExample is not applicable for the arguments (Info, Info)"

// add(i1, i3);

}

public static void add(Info i1, Info i2) {

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

}

}

泛型,可变参数,类似于javascript里的Arguments对象
复制代码 代码如下:
package com.garinzhang.javabase.generic.e10;

public class GenericExample {

public static void main(String[] args) {

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

fun2(i);

}

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

return arg;

}

public static void fun2(T param[]) {

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

for(T t : param) {

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

}

}

}


泛型嵌套:使用泛型类做为参数;根据返回值类型确定返回值
复制代码 代码如下:
package com.garinzhang.javabase.generic.e11;

public class Info {

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;

public class Demo {

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 {

public static void main(String[] args) {

Demo> d;

Info i;

i = new Info();

i.setVar("Coder");

i.setValue(999);

d = new Demo>(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 list = Lists.newArrayList("I ", "am ", "a ", "coder");

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

}

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

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

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

//

// com.google.guava

// guava

// 16.0.1

//

return Lists.newArrayList(elements);

}

}

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号