package generic;

import java.util.ArrayList;
import java.util.List;
/**
* ? -->通配符,类型不确定,用于声明 变量|形参 上
* 不能用在:
* 1,创建对象
* 2,创建泛型类 、泛型方法、泛型接口上
*
*/
public class WildcardTest { public static void main(String[] args) {
//声明
List<?> list = new ArrayList<Integer>();
list = new ArrayList<String>();
list = new ArrayList<Object>(); test(list);
//编译错误,不能创建对象
// list = new ArrayList<?>();
} public static void test (List<?> list){ }
//?不能用在泛型方法上
/*public static <?> void test2(List<?> list){ }*/
//?不能创建泛型类
/*class Test<?>{ }*/
}

当然这样用是没有什么意义的,它和用Object一样

泛型上限 extends:

几个有继承关系的类:

package generic;
/**
* 继承链:
* Object
* / \
* Apple Pear
* /
* FujiApple
*
* @author Administrator
*
*/
public class Fruit { }
class Apple extends Fruit{ }
class Pear extends Fruit{ }
class FujiApple extends Apple{ }

例子程序:

package generic;

import java.util.ArrayList;
import java.util.List;
/**
* extends:泛型的上限 表示 <= ,即 子类
* 1,一般用于 限制操作
* 2,不能用在添加数据上,一般都是读取操作
* 3,规则:
* 遇到 List<? extends Fruit> 什么样的数据可以往上放:
* List<Fruit>
* List<Apple>
* List<? extends Apple>
* 不能存放:
* List<?>
* List<? extends Object>
* @author Administrator
*
*/
public class ExtendsTest { public static void main(String[] args) {
//extends 为上限,List的类型上限是Fruit
Test<Fruit> t1 = new Test<Fruit>();
Test<Apple> t2 = new Test<Apple>();
Test<Pear> t3 = new Test<Pear>(); //调用方法
List<? extends Fruit> list1 = new ArrayList<Fruit>();
test(list1);
List<Fruit> list2 = new ArrayList<Fruit>();
test(list2);
List<Apple> list3 = new ArrayList<Apple>();
test(list3);
List<FujiApple> list4 = new ArrayList<FujiApple>();
test(list4);
List<? extends Apple> list7 = new ArrayList<FujiApple>();
test(list7);
//报错:因为 ? 相当于 ? extends Object,范围超过了Fruit
List<?> list5 = new ArrayList<Object>();
// test(list5);
List<? extends Object> list6 = new ArrayList<Object>();
// test(list6);
} //? extends Fruit
public static void test(List<? extends Fruit> list){ } //内部类
static class Test<T extends Fruit>{ } }

泛型的下限:Super

package generic;

import java.util.ArrayList;
import java.util.List; /**
* super: 泛型的下限 >= 父类或者自身
1,一般用于 下限制操作
* 2,能够添加数据上,不能添加父对象
* 3,规则:
*/
public class SuperTest { public static void main(String[] args) {
//传入的List类型必须 >=Apple,即是 Apple类的父类或自身
List<Apple> list1 = new ArrayList<Apple>();
test(list1);
List<Fruit> list2 = new ArrayList<Fruit>();
test(list2);
List<Object> list3 = new ArrayList<Object>();
test(list3); //规则 Object > Fruit 正确
List<? super Fruit> list4 = new ArrayList<Object>();
test(list4);
//Apple = Apple 正确
List<? super Apple> list5 = new ArrayList<Apple>();
test(list5);
//FujiApple < Apple,编译报错
List<? super FujiApple> list6 = new ArrayList<Object>();
//test(list6);
//? --> ? extends Object ,可能意思是左边声明是Object的子类,右边是Object,不行?
List<?> list7 = new ArrayList<Object>();
//test(list7); } public static void test(List<? super Apple> list){
//不能添加父类对象,子类能添加,这里不是很明白!
list.add(new Apple());
list.add(new FujiApple());
//list.add(new Fruit());//父类不能添加 }
}

泛型嵌套:

学生类:

package generic;

public class Stu<T> {

    private T score;

    public T getScore() {
return score;
} public void setScore(T score) {
this.score = score;
} }

学校类:

package generic;

/**
* @author Administrator
*
* @param <T>
*/
public class School<T> {
private T stu; public T getStu() {
return stu;
} public void setStu(T stu) {
this.stu = stu;
} }

测试类:

package generic;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; /**
* 泛型嵌套
* @author Administrator
*
*/
public class StuApp { public static void main(String[] args) { Stu<String> stu = new Stu<String>();
stu.setScore("优秀");
System.out.println(stu.getScore()); //泛型嵌套:
School<Stu<String>> sch = new School<Stu<String>>();
sch.setStu(stu);
stu = sch.getStu();
String score = stu.getScore();
System.out.println(score); //HashMap
Map<String,String> map = new HashMap<String,String>();
map.put("a", "老大");
map.put("b", "老二"); Set<Entry<String, String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey() +"--->"+ entry.getValue());
}
}
}

泛型没有多态:

package generic;

import java.util.ArrayList;
import java.util.List; public class Other { public static void main(String[] args) {
//多态
Fruit f = new Apple();
//泛型没有多态:
// List<Fruit> list = new ArrayList<Apple>();//错误
List<? extends Fruit> list = new ArrayList<Apple>(); //泛型没有数组
// Fruit<String>[] arr = new Fruit<String>(); //报错 //JDK1.7泛型简化
List<String> list2 = new ArrayList<>(); }
}

java泛型---通配符,泛型嵌套的更多相关文章

  1. Java自学-泛型 通配符

    Java 泛型通配符 ? extends super 的用法 示例 1 : ? extends ArrayList heroList<? extends Hero> 表示这是一个Hero泛 ...

  2. JAVA 泛型通配符 ? EXTENDS SUPER 的用法

    1. <? extends Hero> ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型heroList 的泛型可能 ...

  3. Java学习之==>泛型

    一.什么是泛型 泛型,即“参数化类型”,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型.也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类.接口 ...

  4. 黑马程序员——JAVA基础之泛型和通配符

    ------- android培训.java培训.期待与您交流! ---------- 泛型:            JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...

  5. Java 泛型 通配符类型

    Java 泛型 通配符类型 @author ixenos 摘要:限定通配符类型.无限定通配符类型.与普通泛型区别.通配符捕获 通配符类型 通配符的子类型限定(?都是儿孙) <? extends ...

  6. 【Java】java 中的泛型通配符——从“偷偷地”地改变集合元素说起

    一直没注意这方面的内容,想来这也算是基础了,就写了这个笔记. 首先java的通配符共有三种----先别紧张,现在只是粗略的过一下,看不看其实无所谓 类型 介绍 <?> 无限定通配符,等价于 ...

  7. java里程碑之泛型--类型通配符

    1,泛型与数组在子类上面的对比 在整理java泛型的类型通配符之前,我们先来研究下java在数组设计上的一个不合理.我们来看下面代码: public class Test { public stati ...

  8. -1-3 java集合框架基础 java集合体系结构 Collection 常用java集合框架 如何选择集合 迭代器 泛型 通配符概念 Properties 集合 迭代器

    集合又称之为容器存储对象的一种方式 •数组虽然也可以存储对象,但长度是固定的:显然需要可变长度的容器 集合和数组的区别?                 A:长度区别                  ...

  9. [转]JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别

    原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...

随机推荐

  1. 8.7 使用索引-notes

    七 正确使用索引 一 索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下问题 1 范围问题,或者说条件不明确,条件中出现这 ...

  2. BZOJ 1014 [JSOI2008]火星人prefix (Splay + Hash + 二分)

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8112  Solved: 2569[Submit] ...

  3. 函数作用域和块级作用域--你不知道的JavaScript

    et和const在{}内声明都会变为外部不能访问的值,但是const声明的是常量,也不能修改 函数是 JavaScript 中最常见的作用域单元.本质上,声明在一个函数内部的变量或函数会在所处的作用域 ...

  4. SPSS—回归—二元Logistic回归案例分析

    数据分析真不是一门省油的灯,搞的人晕头转向,而且涉及到很多复杂的计算,还是书读少了,小学毕业的我,真是死了不少脑细胞, 学习二元Logistic回归有一段时间了,今天跟大家分享一下学习心得,希望多指教 ...

  5. java使用WebUploader做大文件的分块和断点续传

    版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

  6. nginx 配置图片服务器 (window版本)

    配置nginx二级域名 ①找到配置文件 例如:%nginx_home%/conf/nginx.conf ②配置 #user nobody; worker_processes 1; #error_log ...

  7. muduo网络库学习之MutexLock类、MutexLockGuard类、Condition类、CountDownLatch类封装中的知识点

    一.MutexLock 类 class  MutexLock  :  boost::noncopyable 二.MutexLockGuard类 class  MutexLockGuard  :  bo ...

  8. SQL Server Extended Events 进阶 2:使用UI创建基本的事件会话

    第一阶中我们描述了如何在Profiler中自定义一个Trace,并且让它运行在服务器端来创建一个Trace文件.然后我们通过Jonathan Kehayias的 sp_SQLskills_Conver ...

  9. C# Socket 实现WebSocket服务器端

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  10. .net程序中http请求的超时配置

    请求时的超时 // // 摘要: // 获取或设置 System.Net.HttpWebRequest.GetResponse() 和 System.Net.HttpWebRequest.GetReq ...