java泛型与通配符

àì夳堔傛蜴生んèń 2024-04-17 20:52 171阅读 0赞

1、泛型类、泛型接口、泛型方法

泛型类

  1. package com.asiainfo.group.generic;
  2. /**
  3. * 泛型类
  4. *
  5. */
  6. public class GenericClassDemo<T> {
  7. private T obj;
  8. public GenericClassDemo(T obj) {
  9. this.obj = obj;
  10. }
  11. public T getObj(){
  12. return obj;
  13. }
  14. }

泛型接口与实现类

  1. package com.asiainfo.group.generic;
  2. /**
  3. * 泛型接口
  4. *
  5. */
  6. public interface GenericInterfaceDemo<T> {
  7. public T getObj();
  8. }
  9. package com.asiainfo.group.generic;
  10. /**
  11. * 泛型接口实现类
  12. *
  13. */
  14. public class GenericInterfaceImpl<T> implements GenericInterfaceDemo<T>{
  15. private T obj;
  16. public GenericInterfaceImpl(T obj){
  17. this.obj = obj;
  18. }
  19. @Override
  20. public T getObj() {
  21. return this.obj;
  22. }
  23. }

泛型方法

  1. package com.asiainfo.group.generic;
  2. import java.util.Map;
  3. public class GenericMethodDemo {
  4. /**
  5. * <T>表明该方法是个泛型方法
  6. */
  7. public <T> T getObj(Class<T> c){
  8. T obj = null;
  9. try {
  10. obj = c.newInstance();
  11. } catch (InstantiationException e) {
  12. e.printStackTrace();
  13. } catch (IllegalAccessException e) {
  14. e.printStackTrace();
  15. }
  16. return obj;
  17. }
  18. /**
  19. * 泛型的数量可以任意多个
  20. */
  21. public <K,V> V getValueByKey(K key,Map<K, V> map){
  22. V value = map.get(key);
  23. return value;
  24. }
  25. }

测试

  1. package com.asiainfo.group.generic.main;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import com.asiainfo.group.generic.GenericClassDemo;
  7. import com.asiainfo.group.generic.GenericInterfaceImpl;
  8. import com.asiainfo.group.generic.GenericMethodDemo;
  9. public class GenericDemo {
  10. public static void main( String[] args ){
  11. //测试泛型类
  12. GenericClassDemo<String> g = new GenericClassDemo<String>("hello");
  13. String obj = g.getObj();
  14. System.err.println(obj);
  15. //测试泛型接口
  16. GenericInterfaceImpl<Date> g2 = new GenericInterfaceImpl<Date>(new Date());
  17. Date d = g2.getObj();
  18. System.err.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d));
  19. //测试泛型方法
  20. GenericMethodDemo g3 = new GenericMethodDemo();
  21. //单个
  22. StringBuffer sb = g3.getObj(StringBuffer.class);
  23. sb.append("ok");
  24. System.err.println(sb.toString());
  25. //多个
  26. Map<String, Integer> map = new HashMap<String,Integer>();
  27. map.put("zhangsan", 20);
  28. map.put("lisi", 25);
  29. map.put("wangwu", 80);
  30. Integer value = g3.getValueByKey("lisi", map);
  31. System.err.println(value);
  32. }
  33. }

2、通配符

一些实体类

  1. package com.asiainfo.group.generic.wildcard;
  2. public interface Animal {
  3. String sleep();
  4. }
  5. package com.asiainfo.group.generic.wildcard;
  6. public class Cat implements Animal{
  7. @Override
  8. public String sleep() {
  9. return "cat----sleep";
  10. }
  11. }
  12. package com.asiainfo.group.generic.wildcard;
  13. public class Dog implements Animal{
  14. @Override
  15. public String sleep() {
  16. return "dog----sleep";
  17. }
  18. }
  19. package com.asiainfo.group.generic.wildcard;
  20. public class Apple{
  21. }

测试

  1. package com.asiainfo.group.generic.main;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.asiainfo.group.generic.wildcard.Animal;
  5. import com.asiainfo.group.generic.wildcard.Apple;
  6. import com.asiainfo.group.generic.wildcard.Cat;
  7. import com.asiainfo.group.generic.wildcard.Dog;
  8. public class WildcardDemo {
  9. /**
  10. * 通常在方法参数中才会使用通配符
  11. */
  12. public void printAnimalSleep(List<? extends Animal> list){
  13. for (int i = 0; i < list.size(); i++) {
  14. System.err.println(i+"----"+list.get(i).sleep());
  15. }
  16. }
  17. public static void main(String[] args) {
  18. //?为无界通配符 extends为上界,super为下界
  19. //通配符?在修饰一个变量的时候用到
  20. List<?> list = new ArrayList<String>();
  21. //使用过通配符修饰的集合变量,只能add(null),因为这个集合中包含的类型已经确定,只是类型信息已经丢失了,add(Object)也不行
  22. list.add(null);
  23. //不加通配符修改变量,可以add任何类型,但不建议这样做
  24. List list2 = new ArrayList<String>();
  25. list2.add(1);
  26. list2.add("hello");
  27. //测试通配符
  28. WildcardDemo wildcardDemo = new WildcardDemo();
  29. List<Cat> cats = new ArrayList<Cat>();
  30. cats.add(new Cat());
  31. cats.add(new Cat());
  32. cats.add(new Cat());
  33. List<Dog> dogs = new ArrayList<Dog>();
  34. dogs.add(new Dog());
  35. dogs.add(new Dog());
  36. dogs.add(new Dog());
  37. List<Apple> apples = new ArrayList<Apple>();
  38. wildcardDemo.printAnimalSleep(cats);
  39. wildcardDemo.printAnimalSleep(dogs);
  40. //编译不通过
  41. //wildcardDemo.printAnimalSleep(apples);
  42. }
  43. }

发表评论

表情:
评论列表 (有 0 条评论,171人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java通配符

    Java泛型是一种强类型约束机制,可以在编译时检查类型安全,防止类型转换错误。通配符是Java泛型的一个重要特性,可以帮助我们更灵活地使用泛型。 什么是泛型通配符? 泛

    相关 通配符

    > 在看Java核心技术卷I中泛型通配符相关的知识时产生了很多疑问,通过了解后简单的做下笔记方便回顾。 > 本文重点记录了一下这几个问题: > > 为什么要用泛型通