java 泛型中 T 和 问号(通配符)的区别

类型本来有:简单类型和复杂类型,引入泛型后把复杂类型分的更细了;

  • 现在List<Object>, List<String>是两种不同的类型;且无继承关系;
  • 泛型的好处如:

    开始版本

      public void write(Integer i, Integer[] ia);
      public void write(Double  d, Double[] da);
    

    泛型版本

      public <T> void write(T t, T[] ta);
    

    简便了代码

定义泛型

  • 1.定义在类后面

    紧跟类名后面

      public class TestClassDefine<T, S extends T>{}
    

    定义泛型 T, S, 且S 继承 T

  • 2.定义在方法装饰符后面

    紧跟修饰符后面(public)

      public <T, S extends T> T testGenericMethodDefine(T t, S s){}
    

    定义泛型 T, S, 且S 继承 T

实例化泛型

  • 1.实例化定义在类上的泛型

第一声明类变量或者实例化时。例如

     List<String> list;
     list = new ArrayList<String>;

第二继承类或者实现接口时。例如

 public class MyList<E> extends ArrayList<E> implements List<E> {...}
  • 2.实例化定义方法上的泛型<br/>

当调用范型方法时,编译器自动对类型参数(泛型)进行赋值,当不能成功赋值时报编译错误

通配符(?)

上面有泛型的定义赋值;当在赋值的时候,上面一节说赋值的都是为具体类型,当赋值的类型不确定的时候,我们用通配符(?)代替了:

 List<?> unknownList;
  List<? extends Number> unknownNumberList;
  List<? super Integer> unknownBaseLineIntgerList;

在Java集合框架中,对于参数值是未知类型的容器类,只能读取其中元素,不能向其中添加元素, 因为,其类型是未知,所以编译器无法识别添加元素的类型和容器的类型是否兼容,唯一的例外是NULL

时间: 2024-10-28 06:33:15

java 泛型中 T 和 问号(通配符)的区别的相关文章

Java泛型中extends和super的理解(转)

E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定的java类型(无限制通配符类型) S.U.V – 2nd.3rd.4th types Object – 是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T.E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换. ?

java泛型-Java泛型上下限super和extendS的使用区别,谢谢

问题描述 Java泛型上下限super和extendS的使用区别,谢谢 class DemoF{ public static void printA(Collection<?super Cat> c){ 相同的方法体,例如打印集合} public static void printB(Collection<?extend Animal> c){相同的方法体,例如打印集合} public static void main(String[ ] args){ Collection<

Java Web 中 过滤器与拦截器的区别

过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符 拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现

Java 泛型中super T和extends T的区别

经常发现有List< super T>.Set<extends T>的声明,是什么意思呢?< super T>表示包括T在内的任何T的父类,< extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别. extends List< extends Number> foo3的通配符声明,意味着以下的赋值是合法的:    // Number "extends" Number (in this co

从零开始来看一下Java泛型的设计

引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除. 泛型基础 泛型类 我们首先定义一个简单的Box类: public class Box { private String object; public void set(String object) { this.object = object; } public String get() { return object;

关于java泛型问题,为什么把extends改为super就不会出错

问题描述 关于java泛型问题,为什么把extends改为super就不会出错 class Employee{ } class Manager extends Employee{ }class CEO extends Manager{ }public class Test{ public static void main(String[] args) { List<? super Manager> list=new ArrayList();//编译不会出错 //List<? extend

java泛型怎么理解?求指教

问题描述 java泛型怎么理解?求指教 java泛型中,定义泛型方法格式:public T fun(T t),这几个T分别是什么意思? 我知道最后一个T是参数,那前面两个T表示什么?哪个表示返回类型? 解决方案 你的意思应该是public T fun(T t)中几个T的含义.从左至右: 1,代表声明此方法中T是泛型,否则T代表名字为'T'的类 2,第二个T代表返回值 3,第三个代表参数 另外带泛型的类写法是 class Demo<E>{ void method1(E obj){ } E met

Java泛型和通配符那点事

泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样. 可以在集合框架(Collection framework)中看到泛型的动机.例如,Map类允许您向一个Map添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如String)的对象. 因为Map.get()被定义为返回Object

浅谈Java泛型通配符解决了泛型的许多诟病(如不能重载)_java

泛型: package Java基础增强; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class Test2 { @Test public void fun1(){ Object[] objects = new Object[10]; List list = new ArrayList(); String[] strings = new String[10]; List<Str