java泛型常用通配符实例解析
这篇文章主要介绍了java泛型常用通配符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
今天在看ArrayList原码是看到这样的一个符号,好奇怪。
?表示通配符,表示的意思是匹配E或E的子类,具体类型未知。
1.限定通配符
编写一个类似于ArrayList的动态数据
public class Gys<T> { private final static int default_capacity =10; private int endIndex =0; private Object[] elemts; public Gys() { this.elemts = new Object[default_capacity]; } public void add(T t){ if(elemts.length-1< endIndex){ int newCapcti= default_capacity *2; elemts= Arrays.copyOf(elemts,newCapcti); } elemts[endIndex++]=t; } public void addAll(Gys<T> cs){ for(int i=0;i<cs.size();i++){ add(cs.get(i)); } } public int size(){ return endIndex; } public T get(int i){ if(i< endIndex){ return (T) elemts[i]; } throw new RuntimeException("索引超出界限"); } public static void main(String[] args) { Gys<Number> gys=new Gys<>(); gys.add(25); Gys<Integer> gys2=new Gys<>(); gys2.add(2); gys.addAll(gys2); } }
修改上面的代码,将addAll参数改成如下
public void addAll(Gys<? extend T> cs){ for(int i=0;i<cs.size();i++){ add(cs.get(i)); } }
这个时候代码编译通过了。并且能够正常的访问其中的元素。
2.无限定通配符。
改写上面的addAll方法代码。
public void addAll(Gys<?> cs){ for(int i=0;i<cs.size();i++){ add(cs.get(i)); } }
上面的代码编译不通过。?表示类型不确定,从安全角度考虑无限定的泛型,无法进行写操作。
但是可以这样使用。
/** *判断元素是否存在 */ public boolean isHas(Gys<?> gys,Object elemt){ for(int i=0;i<gys.size();i++){ if(gys.get(i).equals(elemt)){ return true; } } return false; }
除了<? extend E>用法;还有<? super E>的用法,表示类型是E或E的父类。不过多介绍了,用的少。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
详谈Java泛型中T和问号(通配符)的区别
类型本来有:简单类型和复杂类型,引入泛型后把复杂类型分的更细了. 概述 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引入泛型的好处是安全简单. 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的"任意化","任意化"带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对
-
Java泛型类型通配符和C#对比分析
c#的泛型没有类型通配符,原因是.net的泛型是CLR支持的泛型,而Java的JVM并不支持泛型,只是语法糖,在编译器编译的时候都转换成object类型 类型通配符在java中表示的是泛型类型的父类 public void test(List<Object> c) { for(int i = 0;i < c.size();i++) { System.out.println(c.get(i)); } } //创建一个List<String>对象 List<String&g
-
Java泛型初学者之上、下界通配符的深入理解
泛型的由来 为什么需要泛型 Java的数据类型一般都是在定义时就需要确定,这种强制的好处就是类型安全,不会出现像弄一个ClassCastException的数据给jvm,数据安全那么执行的class就会很稳定.但是假如说我不知道这个参数要传什么类型的,因为公司需求在变,如果写死的那就只能便以此需求就改一次,很麻烦.sun公司也注意到这个问题,这样会让代码的灵活性降低,他们就研究出了泛型. 泛型初识 什么是泛型,可以字面理解就是一个泛泛的类型,他是不确定的,在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
-
Java泛型之上界下界通配符详解
泛型,继承和子类 如你所知,只要类型兼容,就可以将一种类型的对象分配给另一种类型的对象.例如,你可以指定一个整数一个对象,因为对象是一个整数的超类型: Object someObject = new Object(); Integer someInteger = new Integer(10); someObject = someInteger; // 好 在面向对象的术语中,这被称为"是一种"关系.由于Integer 是一种Object,因此允许赋值.但是Integer也是一种Num
-
一看就懂 详解JAVA泛型通配符T,E,K,V区别
1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法.Java语言引入泛型的好处是安全简单. 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的"任意化","任意化"带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的.对于强制类型转
-
Java中泛型通配符的使用方法示例
本文实例讲述了Java中泛型通配符的使用方法.分享给大家供大家参考,具体如下: 一 点睛 引入通配符可以在泛型实例化时更加灵活地控制,也可以在方法中控制方法的参数. 语法如下: 泛型类名<? extends T> 或 泛型类名<? super T> 或 泛型类名<?> ? extends T:表示T或T的子类 ? super T:表示T或T的父类 ?:表示可以是任意类型 二 通配符在泛型类创建泛型对象中使用 1 代码 class gent<T> { publ
-
Java 泛型总结(三):通配符的使用
简介 前两篇文章介绍了泛型的基本用法.类型擦除以及泛型数组.在泛型的使用中,还有个重要的东西叫通配符,本文介绍通配符的使用. 这个系列的另外两篇文章: Java 泛型总结(一):基本用法与类型擦除 Java 泛型总结(二):泛型与数组 数组的协变 在了解通配符之前,先来了解一下数组.Java 中的数组是协变的,什么意思?看下面的例子: class Fruit {} class Apple extends Fruit {} class Jonathan extends Apple {} class
-
java泛型常用通配符实例解析
这篇文章主要介绍了java泛型常用通配符实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天在看ArrayList原码是看到这样的一个符号,好奇怪. ?表示通配符,表示的意思是匹配E或E的子类,具体类型未知. 1.限定通配符 编写一个类似于ArrayList的动态数据 public class Gys<T> { private final static int default_capacity =10; private int end
-
Java Web开发入门书籍实例解析(总结一)
从事Java Web开发这一段时间来,对Java 面向对象的思想和MVC开发模式可以说已经熟悉了.我当前参与的项目使用的框架是Spring.SpringMVC.Hibernate.下面我们小编给大家整理一篇教程帮助大家学习javaweb相关知识,感兴趣的朋友可以参考下. 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 1.静态web资源(如html 页面):指w
-
Java编程guava RateLimiter实例解析
本文主要研究的是Java编程guava RateLimiter的相关内容,具体如下. 令牌桶算法(token bucket algorithm) 场景1 在流量监管中的应用 约定访问速率(CAR)是流量监管常用技术之一,可以应用在端口进和出方向,一般应用在入方向,它的监管原理如图1所示. a. 按特定的速率向令牌桶投放令牌 b. 根据预设的匹配规则先对报文进行分类,不符合匹配规则的报文不需要经过令牌桶的处理,直接发送: c. 符合匹配规则的报文,则需要令牌桶进行处理.当桶中有足够的令牌则报文可以
-
Java数组越界问题实例解析
Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化, 动态初始化:指定长度,由系统给出初始化值 静态初始化:给出初始化值,由系统给出长度 在我们使用数组时最容易出现的就是数组越界问题,好了,这里有个简单的例子 int [][] array = {{1,2,3},{1,4}}; System.out.println(array[1][2]); 这是一个二维数组,很明显,数组越界了,控制台中会打印如下信息: Exception in thread "main" java.l
-
Java多线程回调方法实例解析
所谓回调,就是客户程序C调用服务程序S中的某个方法A,然后S又在某个时候反过来调用C中的某个方法B,对于C来说,这个B便叫做回调方法. 下面看一个实际例子来理解: 本示例设置一个提问者,一个回答者,而回答者需要回答提问者一个很深奥的问题时,这时需要很多时间去查找,提问者又开始做其他的事情, 等回答者找到答案后,再把答案告诉提问者. 一.提问者的类 涉及到长时间的思考,要sleep,要继承Thread package com.xykj.thread; public class XiaoZhang
-
java线程的基础实例解析
java中建立线程可以有两种方式,分别是继承Thread类和实现Runnable接口. 继承Thread public class MyThread extends Thread{ public MyThread(String name){ super(name); } int i; public void run(){ for(i=0;i<5;i++){ System.out.println(getName()+"--"+i); } } public static void m
-
java编程多线程并发处理实例解析
本文主要是通过一个银行用户取钱的实例,演示java编程多线程并发处理场景,具体如下. 从一个例子入手:实现一个银行账户取钱场景的实例代码. 第一个类:Account.java 账户类: package cn.edu.byr.test; public class Account { private String accountNo; private double balance; public Account(){ } public Account(String accountNo,double
-
Java中后台线程实例解析
本文研究的主要是Java中后台线程的相关问题,具体介绍如下. 以前从来没有听说过,java中有后台线程这种东西.一般来说,JVM(JAVA虚拟机)中一般会包括俩种线程,分别是用户线程和后台线程.所谓后台线程(daemon)线程指的是:在程序运行的时候在后台提供的一种通用的服务的线程,并且这种线程并不属于程序中不可或缺的部分.因此,当所有的非后台线程结束的时候,也就是用户线程都结束的时候,程序也就终止了.同时,会杀死进程中的所有的后台线程.反过来说,只要有任何非后台线程还在运行,程序就不会结束.不
-
java抛出异常与finally实例解析
这篇文章主要介绍了java抛出异常与finally实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下: package test1; public class EmbededFinally { public static void main(String args[]) { int result; try { System.out.println("in Level 1"); try { System.out.print
-
Java HashMap原理及实例解析
这篇文章主要介绍了Java HashMap原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 示例 1 : HashMap的键值对 HashMap储存数据的方式是-- 键值对 package collection; import java.util.HashMap; public class TestCollection { public static void main(String[] args) { HashMap<String
随机推荐
- 使用FTP下载目录,即FTP命令批量自动下载的bat文件
- 基于C语言实现五子棋游戏完整实例代码
- 深入解析Go语言编程中slice切片结构
- jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
- Extjs学习笔记之六 面版
- python的else子句使用指南
- PHP编实现程动态图像的创建代码
- Python实现的Kmeans++算法实例
- 初学jsp心得
- 详解Docker目录挂载的方法总结
- linux下指定mysql数据库服务器主从同步的配置实例
- Node.js编码规范
- oracle中to_date详细用法示例(oracle日期格式转换)
- html文件中jquery与velocity变量中的$冲突的解决方法
- 如何实现一定概率选中某一个字母
- Java中使用BigDecimal进行精确运算
- java编程实现根据EXCEL列名求其索引的方法
- Android自定义ViewGroup实现绚丽的仿支付宝咻一咻雷达脉冲效果
- ymPrompt的doHandler方法来实现获取子窗口返回值的方法
- Android一步步带你在RecyclerView上面实现"拖放"和"滑动删除"功能