泛型------thinking in java

基于STM32F4的NRF24L01驱动程序 基于STM32F4xx的NRF24L01驱动程序 提示:硬件平台基于STM32F427VIT6、NRF24L01模块 文章目录基于STM32F4xx的NRF24L01驱动程序前言一、NRF24L01简单介绍1,什么是NRF24L012,NRF24L01通信方法3,NRF24L01通信原理4,地址分配&通道分配问题二、STM32CubeMX配置三、添加底层文件1,添加.c/.h文件到工程中2,使用说明四,下载 前言 提示:本例程采用STM32CubeMX配置底层,采用硬件SPI方式驱动NRF24 阅读详情

很多原因促成了泛型的出现,而最引人注目的原因,是为了创建容器类。


620

package com.shan.thinkinginjava.generics;
// generics/HolderEx2.java
// TIJ4 Chapter Generics, Exercise 2, page 621
/* Create a holder class that holds three objects of the same type along 
* with the methods to store and fetch those objects and a constructor to 
* initialize all three.
*/ 
import typeinfo.pets.*;
/**
 * 机器人
 * @author sjtd
 *
 */
class Robot {
private String name;
public Robot(String name) { this.name = name; }
public String toString() { 
return name;
}
}


public class HolderEx2<T> {
private T x, y, z;
public HolderEx2(T x, T y, T z) { 
this.x = x;
this.y = y;
this.z = z;
}
public void setX(T x) { this.x = x; }
public void setY(T y) { this.y = y; }
public void setZ(T z) { this.z = z; }
public T getX() { return x; }
public T getY() { return y; }
public T getZ() { return z; }
public String toString() {
return x + ", " + y + ", " + z;
}
public static void main(String[] args) {
Robot a = new Robot("bot1");
Robot b = new Robot("bot2");
Robot c = new Robot("bot3");

HolderEx2<Robot> hEx2 = 
new HolderEx2<Robot>(a, b, c);

System.out.println("Holding: " + hEx2);
}
}


元组的概念

package com.shan.thinkinginjava.generics;
/**
 * 
 * @author sjtd
 *
 * @param <A>
 * @param <B>
 * 对于一个函数的返回值,return仅仅允许返回单个对象
 * 而元组,可以将一组元素打包存储于一个单一的对象
 * 这个容器对象允许读取其中元素,但是不允许存放新的对象
 * 
 */
public class TwoTurple<A,B> {

//在这里A,B都是final的,这种方式很安全,
//如果程序员想使用新的元祖,就强制要求他们重新创建一个TwoTurple对象
public final A first;
public final B second;
public TwoTurple(A first, B second) {

this.first = first;
this.second = second;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "("+first +","+second+")";
}

public static void main(String[] args) {
//在这里编译期接受类型检查。compile failed;
//TwoTurple<String, Integer> tt = new TwoTurple<String, Integer>("a", "a");
TwoTurple<String, Integer> tt = new TwoTurple<String, Integer>("dan", 23);
System.out.println(tt.toString());
}
}


可以继承这个类,持有更多的对象,例如

package com.shan.thinkinginjava.generics;
import typeinfo.pets.Dog;
import typeinfo.pets.Gerbil;
import typeinfo.pets.Pet;




//generics/Holder3.java
//TIJ4 Chapter Generics, Exercise 1, page 621
//Use Holder3 with the typeinfo.pets library to show that a Holder3 that is
//specified to hold a base type can also hold a derived type.
public class Holder3<T> {
private T a;
public Holder3(T a) { this.a = a; }
public void set(T a) { this.a = a; }
public T get() { return a; }
public static void main(String[] args) {
Holder3<Pet> h3 = 
new Holder3<Pet>(new Pet());
Pet a = h3.get(); // No cast needed
System.out.println(h3.get());
// can also hold a subclass of Pet:
h3.set(new Dog());
System.out.println(h3.get());
// can also hold a sububclass of Pet:
h3.set(new Gerbil());
System.out.println(h3.get());
}
}

624泛型化 innerclasses/Sequence.java类


package com.shan.thinkinginjava.generics;
// generics/GenericSequence.java
// TIJ4 Chapter Generics, Exercise 4, page 624
// 'Generify' innerclasses/Sequence.java.




import java.util.*;
/**
 * 这个借口和java中的迭代器是一个原理的
 * @author sjtd
 *
 */
interface Selector {
boolean end();
Object current();
void next();
}


public class GenericSequence<E> {
private List<E> list = new ArrayList<E>();
//private int next = 0;
public GenericSequence(List<E> list) { this.list = list; }
public void add(E e) { list.add(e); }
/**
* 
* 内部类实现了这个接口
*
*/
private class SequenceSelector implements Selector {
private int i = 0;
public boolean end() { return i == list.size(); }
public Object current() { return list.get(i); }
public void next() { if(i < list.size()) i++; } 
}
public Selector selector() {
return new SequenceSelector();
}
public static void main(String[] args) {
List<String> ls = new ArrayList<String>();
GenericSequence<String> gs = new GenericSequence<String>(ls);
for(int i = 0; i < 10; i++)
gs.add(Integer.toString(i));
Selector selector = gs.selector();
while(!selector.end()) {
System.out.print(selector.current() + " ");
selector.next();
}
}
}

国科大学习资料--人工智能原理与算法-第六次作业解析(学长整理) 国科大学习资料–人工智能原理与算法-第六次作业解析(张文生老师主讲)(6.6、6.7、6.11) 6.6 说明如何通过使用辅助变量把诸如A+B=C这样的三元约束转变成三个二元约束。假设值域是有限的。(提示:考虑引进新变量表示变量对的值,引进约束如“X是Y变量对中的第一个元素”。)然后说明如何把多于三个变量的约束类似地转换为二元约束。说明如何通过改变变量的值域来消除一元约束。这就完整演示了任何CSP都可以转变为只含二元约束的CSP。 答:首先,我们引入一个新变量AB,假设A和B的范围均为N,AB的范围为N×N 阅读详情

相关推荐

CentOS 7 安装 Python 3.10

我这里已经软链接了,正常未链接之前是python->python2.7而不是python3.10。python2.7默认安装是在 /usr/bin目录中,切换到/usr/bin/更改yum配置,因为其要用到python2才能执行,否则会导致yum不能正常使用。2. 安装 Python 3.10 必需的 openssl >= 1.1.1。默认的centos7是没有安装pip,先添加epel扩展源。/usr/bin/python 修改为如下。添加软链接,将原来的链接备份。添加python3的软链接。

bensonyang888的博客 2905

Thinking in Java 泛型

介绍

Stay hungry , Stay foolish 1178

数字电子时钟——数字电路课设

本文设计了一种基于中小规模集成电路的数字电子时钟系统,采用模块化设计方法,包含晶振电路(CD4060+D触发器)、计时电路(74HC161计数器)、数码管驱动(CD4511)和整点报时功能。系统实现了60进制秒/分、24进制小时、7进制星期的计时显示,支持手动校时功能,并具备整点报时特性(59分54-58秒5次500Hz低音,59秒1次1000Hz高音)。通过分模块调试与整合,最终实物电路满足设计要求,获得优秀评价。

来自FZU——电子科学与技术专业 1489

thinking in java - 泛型1

而使用泛型方法的时候,通常不需要我们指定具体的参数类型,因为编译器会通过类型推断帮助我们找到具体的类型,这也叫类型参数推断。所以当我们调用泛型方法的时候,我们可以像普通方法一样调用即可,但是注意如果传入基本类型的时候,编译器会使用自动打包,将基本类型的包装类型传入。但是有的时候,限制我们的参数在一个派生组合里面,也非常限制我们的代码的扩展性。Java泛型是通过擦除来实现的,这意味着,当我们使用泛型的时候,实际上所有的类型信息都被擦出了,你唯一知道的是我们在使用一个对象。聪明的你,也许会相到接口。

Snow的博客 724

UFS Write Booster技术解析:原理、配置与故障排查实战

在存储技术领域,缓存机制是提升I/O性能的核心手段之一,其原理是通过高速存储介质暂存数据,减少对低速主存储的直接访问,从而降低延迟、提升吞吐。Write Booster正是这一原理在UFS(通用闪存存储)规范中的具体实现,它通过引入独立的易失性高速缓存区(Write Booster Buffer),将主机写入命令快速响应与后台数据持久化分离,技术价值在于显著改善随机写入性能,消除由垃圾回收等后台操作引发的写入卡顿。该技术广泛应用于智能手机应用安装、相机连拍、固件升级(OTA)等对写入流畅性要求高的场景。本文

weixin_42561143的博客 356

oracle rac 成本及架构,Oracle Extended RAC 架构实战

Extended-RAC,是RAC技术的一种扩展增强。Extended-RAC是通过专用光纤(或租用裸光纤)加DWDM(波分设备)设备将两个不同楼栋/同城甚至异地机房进行相连,将数据库主机、存储分别放置于不同机房,利用存储复制/ASM Mirror等技术进行数据复制进行搭建的一种远距离集群架构。Extended RAC需要将不同楼栋/同城甚至异地机房通过专用光纤(或租用裸光纤)加DWDM(光纤复用...

weixin_33812391的博客 2453

JAVA 泛型 Thinking in Java

我们可以利用多态的特性将基类作为方法的参数类型使用,使代码更加灵活,但需要不断的继承基类;我们可以利用接口的特性来实现特定的方法,从而方便快捷的实现一个新类来达到目的,但;但是javaSE5带来了一个新概念:泛型。泛型实现了参数化类型,使代码可以应用于多种类型。 1.简单泛型 泛型出现的一个主要原因就是:容器类。如果我们想要创造一个容器类,那么可以这样: public class Cont...

top_explore的博客 360

【深度解析】AURIX TC387 UCB Flash架构与避坑指南(第一篇)

摘要:UCB(用户配置块)是AURIX TC3xx芯片启动与安全的关键配置区域,位于DFLASH0存储区。每个512字节的UCB包含启动模式、安全设置等关键参数,并通过强制CRC32校验确保完整性。UCB分为启动头(UCB_BMHD)、安全配置(UCB_ORIG)及其备份(UCB_COPY)三种主要类型。不同于常规Flash,UCB具有自动擦除特性,错误配置可能导致芯片永久锁死。开发中应谨慎修改UCB,必须同时编程原始和备份版本,并确保正确的CRC校验。后续文章将详细介绍UCB编程方法和调试技巧。

2511_94612429的博客 1235

Thinking In Java有感——java泛型

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对

huanglong0438的专栏 546

华为OD面试八股真题 - 操作系统 - 1

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 1641

【AI智能体】最强AI编程利器 Claude Code 从部署到项目实战详解

最强AI编程利器 Claude Code 从部署到项目实战详解

congge 4511

Thinking in java4 15章 泛型

Thinking in java4 15章 泛型1 生成器的妙用2 Set2的集合,操作。//: net/mindview/util/Sets.java package net.mindview.util;import java.util.*;public class Sets { public static <T> Set<T> union(Set<T> a, Set<T> b) {

zhouhx1132的博客 418

如何实现在Go语言中替换程序自身

总结起来,我们可以通过将新的程序二进制文件写入磁盘,并在运行时启动这个新的程序来实现在Go语言中替换程序自身。在Go语言中,有时候我们需要在程序运行时替换程序自身,例如更新程序版本或者进行热重启。本文将介绍一种正确的方式来实现在Go语言中替换程序自身的方法,并提供相应的源代码示例。此外,替换程序自身可能会导致正在运行的程序产生意外行为或终止,请谨慎使用,并确保在合适的时机进行替换操作。实现替换程序自身的关键是将新的程序二进制文件写入到磁盘,并在运行时启动这个新的程序。函数启动新的可执行文件,并在后台运行。

HoUnix的博客 289

thinking in java - 泛型2

虽然ArrayMaker的kind参数通过Class保留了类型信息,但Array.newInstance的返回类型设计为Object,因为它需要支持所有可能的componentType(如String.class、Integer.class等),无法在编译时静态绑定到具体类型。当通过反射创建数组时,返回的实际类型(如String[])在运行时是明确的,但编译器无法验证其与泛型类型T[]的兼容性,因此需要显式强制转换。其实泛型,本身就是为了,让我们的代码能够处理多个类,让代码更加具有泛化能力。

Snow的博客 421

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Thinking In Java Part09(泛型类、泛型方法)

1、接口与类型信息 interface关键字的一种重要目标就是允许程序员隔离构件,进而降低耦合性。 javap -private C 可以反编译显示出这个类的所有方法,无论private还是匿名 2、泛型 实现了参数化类型的概念,使代码可以应用于多种类型。术语的意思为:“适用于许多许多的类型”。最初的目的是希望类或方法能够具备最广泛的表达能力,通过解耦类或方法与所使用的类型之间的约束。 泛型的主要目的之一就是用来指定容器要持有什么类型的对象,而且由编译器来保证类型的正确性。 核心概念:告诉编译器想

civilizationV的博客 258

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Thinking in Java---泛型小结

1)基本概念:   泛型(Generic Type或Generics)是 对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看做是使用参数化类型时指定的类型的一个占位符,就像方法的形 式参数是运行时传递的占位符一样,泛型的体现主要是在集合框架里面可以看到,JCF里面应该是1.5里面使用泛型最多的地方。Java语言引入泛型是一个 较大的功能增强,不仅语言、

荒野孤鹰 1837

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java泛型代码杂谈

《Thinking In Java》 ——— 献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们! 在学习《Thinking in java》书中总能获得一些收获,纸质版第四版中关于java泛型写了大概几百页,内容丰富至极,详细分析了泛型在内存堆栈还有和C++的对比,感谢原书作者Bruce Eckel带给我那么多惊喜。 接下来我我总结了一些关于书中泛型的经典代码。(本人win10操作系统

优快云_ZOL的博客 508

9.泛型(Thinking in java 学习九)

多态算是一种泛化机制,但是拘泥于单继承体系,也会使程序受限太多。JavaSE5中提出了泛型的概念。 泛型概念:泛型实现了参数化类型的概念,使代码可以应用于多种类型。 简单泛型(泛型类) 为了创造容器类,是促成了泛型出现的主要原因。泛型的主要目的之一是用来指定容器要持有什么类型的对象,而且由编译器来保证类的正确性。 public class Holder<T>{ private ...

欢迎交流 268

Thinking in java-38 Java 泛型Generics in java

1. Generics 泛型引入泛型是在Java 5 之后引入到java 语言中的,其目的是为了提供编译时类型检查,减少ClassCastException异常风险。容器参数化能力是当初Generic引入的一个主要动力,它将运行时异常ClassCastException在编译时就强制检查,如果类型不匹配将抛出一个编译时错误。2. Generic Class泛型类我们可以定义泛型类。泛型类型是一种具

toseektruth的博客 453

[Thinking in Java]15.泛型

1.泛型接口与工厂方法相结合. public class CoffeeGenerator implements Generator, Iterable { private Class[] types = { Latte.class, Mocha.class, Cappuccino.class, Americano.class, Breve.class, }; private

MrRoyLee的专栏 683

Thinking In Java Part10(泛型擦除)

1、泛型擦除 ArrayList<String> ArrayList<Integer> 我们可能认为类型不同,但其实它们是相同的 ArrayList<Integer> arrays= new ArrayList<>(); ArrayList<String> arrays1= new ArrayList<>(); arrays.add(2); arrays1.ad

civilizationV的博客 231

thinking in java学习记录(十五)泛型

15.1 与C++比较 15.2 简单泛型 15.2.1 一个元组类库 15.2.2 一个堆栈类 15.2.3 RandomList 15.3 泛型接口 15.4 泛型方法 15.4.1 杠杆利用类型推断参数 15.4.2 可变参数与泛型方法 15.4.3 用于Generator的泛型方法 15.4.4 一个通用的Generator 15.4.5 简化元组的使用 15.4.6 一个Set的实用工具...

c630843901的博客 324

Thinking In Java -- Chapter 15 -- 泛型

Java泛型的核心概念:告诉编译器想使用什么类型,然后编译器帮你处理一切细节。 //: generics/Holder3.java public class Holder3<T> { private T a; public Holder3(T a) { this.a = a; } public void set(T a) { this.a = a; } public T get() { return a; } public static void main(String

ljd781311726的博客 244

Thinking in Java - 学习笔记 - (十五)泛型

Java编程思想 - 第十五章 - 泛型 泛型实现了参数化类型的概念。“泛型”这个术语的意思是:“适用于许多许多的类型”。 泛型方法 无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法,因为它可以使事情更清楚明白。另外,对于一个static的方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力...

C.W.WANG的博客 317

Java泛型Generic - Thinking in Java读书笔记

1.什么是泛型? 泛型就是可适用于很多的类,它实现了参数化类型type parameter的概念,参数化类型指可使用多种类型。 多态是一种泛化机制。 例如方法 A(Base b){}//Base是一个基类 这样方法A就可以接受从这个基类Base的任何子类作为参数。方法的参数也可以是一个接口,但是由于类的单继承体系和接口的约束( An interface still ...

143

Thinking in java学习笔记—泛型(擦除)

一、泛型擦除 在泛型代码内部,无法获得任何有关泛型参数类型的消息。 import java.util.Arrays; class AA{} class CC{} class B{} public class Generic { public static void main(String[] args){ AA a = new AA(); CC c = new CC();

kisionl的博客 562
上一篇: android 中Message、Handler、Message Queue、Looper之间的关系
下一篇: 关于String 类
僤尐僤
博客等级 码龄14年 10粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值