您的位置:首页 > 编程语言 > Java开发

多个java泛型示例分享

2015-11-19 16:51 387 查看
转自:http://www.jb51.net/article/48965.htm



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;

}

}

/**

* 测试泛型类

*/

public class TestOne {

public static void main(String[] args) {

//测试Integer泛型

Test<Integer> t1 = new Test<Integer>();

t1.setValue(5);

Integer i = t1.getValue();

System.out.println(i);

//测试Double泛型

Test<Double> t2 = new Test<Double>();

t2.setValue(5.55D);

Double d = t2.getValue();

System.out.println(d);

//测试String泛型

Test<String> t3 = new Test<String>();

t3.setValue("hello world");

String str =t3.getValue();

System.out.println(str);

}

}

输出结果:

复制代码 代码如下:

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"));

}

}

输出结果:

复制代码 代码如下:

jianing

24

2.泛型接口

复制代码 代码如下:

package test.lujianing;

/**

* 泛型接口

* @param <T>

*/

public interface TestImpl<T> {

public void setValue(T t);

public T getValue();

}

输出结果:

复制代码 代码如下:

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;

}

}

/**

* 泛型方法测试类

*/

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);

}

}

输出结果:

复制代码 代码如下:

java.lang.Integer

30

java.lang.Double

40.0022

4.限制泛型

在上面的例子中,没有限制class Test<T>类型持有者T的范围,默认限定类型相当于Object。比如我们要限制T为数字接口类型。只需要这么做:class Test<T extends Number>,这样类中的泛型T只能是Number接口的实现类,传入非Number接口编译会出错。

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());

}

}

}

输出结果:

复制代码 代码如下:

key:Double value:class java.lang.Double

key:Integer value:class java.lang.Integer

简单的例子:针对1.1的例子

复制代码 代码如下:

public static void main(String[] args) {

//测试Integer泛型

Test<Integer> t1 = new Test<Integer>();

t1.setValue(5);

fun(t1);

//测试Double泛型

Test<Double> t2 = new Test<Double>();

t2.setValue(5.55D);

fun(t2);

}

public static void fun(Test<?> t){

System.out.println("通配泛型"+t.getValue());

}

输出结果:

复制代码 代码如下:

java.lang.Integer

通配泛型5

java.lang.Double

通配泛型5.55

6.补充

在泛型中,可能会遇到<T><E>等,T和E分别是Type和Element的首字母。E一般用来表示集合类型中的元素的类型,例如List接口的定义,public interface List<E> extends Collection<E>。这只是一种命名习惯,两者没有本质区别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: