Generics Types 泛型学习笔记<二>

4G基站BBU、RRU、核心网设备 本文主要分享移动通信基站相关的设备 阅读详情

Generics Types 泛型学习笔记<二>

作者:冰云
时间:2004-02-24
联系:icecloud(AT)sina.com
Blog:http://icecloud.51.net

首先我要特别感谢Schlemiel,他指出了类型协变的问题。其实我以前也看到过gigix翻译的那篇文,但是没看懂也没经大脑。经Schlemiel一提醒,我才意识到,这是泛型的规范。再翻出来看,如醍醐灌顶,真良师益友也。

我写文章的目的,就是为了能够找到更多同好进行交流。没有交流,没有氛围,绝对不会有提高。谢谢Schlemiel,每次读他的文章或评论,都能受到很大的启发。

如果需要深入了解泛型,请阅读程序员杂志2003第7期,或

http://gigix.cool2u.net/download/Variance_in_Java.pdf

 

ok,继续上次的学习笔记。这篇22页的文章正好读了3天。每天从地铁东四十条到西直门,每次读7页。如果哪位晚上6:30-7:00间看到地铁上有个人拿着本电脑书在读,不妨上来问问是不是俺 ^___^||

另:后面文中每章出现了不少重点,我就按照和文中章节一样的标题。Notes则自己编号。

这次特地把字体变为14px,不知道各位看起来如何啊?会不会太大?

5 泛型方法(函数)

 

根据上一条,既然通配符类型是只读的,那么怎样才能在函数中写入呢?这就引入了泛型函数(Generic Mehtods):

 

 

    <T> static void fromArrayToCollection(T[] a, Collection<T> c) {

       for (T o : a){

           c.add(o); //correct

       }

    }  

    Collection<Object> co = new ArrayList<Object>;

    Collection<String> cs = new ArrayList<String>;

    fromArrayToCollection(new Integer[100], co); //correct

    fromArrayToCollection(new Number[100], cs); // error

 

 

    可以知道,不需要传递世纪参数到泛型方法,编译器会自行推断类型。

那么,什么时候使用泛型方法,什么时候使用通配符类型呢?可以这样理解:

 

Note 5: 可以采用泛型方法来保证读写操作的类型安全。泛型方法相当于原来的多态方法,它的效果是允许执行时选用不同的参数类型,而通配符方法相当于接受Object的方法。

原文:This tells us that the type argument is being used for polymorphism; its only effect is to allow a variety of actual argument types to be used at different invocation sites.

考虑下面的方法,

      

       public static <T, S extends T> void copy (

              List <T> dest, List <S> src) ();

       public static <T> void copy (

              List <T> dest, List <? extends T> src) ();

 

 

    哪一个更清楚明了一点?因为S只用了一次,因此可以用通配符类型取代S。这样更简练。通配符类型的另一个好处是,他们可以用在方法外面,作为值域(fields)、本地变量(local variables)或数组的类型。如

 

      

       static List<List<? extends Shape>> history

              = new ArrayList<List<? extends Shape>>();

 

       public void drawAll(List<? extends Shape> shapes){

           history.addLast(shapes);

       }

 

 

说实话,我看到上面的变量定义简直想骂人。这个是定义了一个List的List,也就是history是保存List<? extends Shape>的List。

 

6 泛型与旧代码

在泛型代码中使用旧代码可能导致类型安全隐患。

 

      

    public interface Inventory {

       void setCats(Collection c);

       Collection getCats();

    }

    Collection<Cat> c = new ArrayList<Cat>();

    c.add(new BlackCat());

    Inventory.setCats(c);

    Collection<Cat> k = Inventory.getCats();

 

 

Note 6: 一般编译器无法知道Collection引用了何种类型,这样的没有带有类型的Collection称为row type。这样的类型表示一些未知类型,相当于Collection<?>。

原文:The compiler has no way of knowing what kind of collection the type Collection refers to. It’s called a raw type. It’s more accurate to say that the type Collection denotes a collection of some unknown type like Collection<?>.

 

这种情况下,把Collection<?>赋值给Collection<Cat>是合法的,但是会出现一个unchecked warning,未检查警告。表示编译器无法保证它的正确性。因此使用旧代码时候请注意unchecked warning.

 

Note 7: 泛型编译时会被编译器进行一次称为erasure的过程。可以认为就是将泛型的代码转换为非泛型版本。最终的结果是:JVM不会检查类型安全和完整性,就算出现了unchecked warning也一样。Erasure会删除所有的泛型信息,如将List<String>转换为List,所有的类型变量被替换为最上限的,如Object。并且不管结果代码如何,都会增加类型转换。

原文:Generics are implemented by the Java compilers as a front-end conversion called ensure. It just like a source-to-source translation. As a result, the type safety and integrity of the JVM are never at risk, even in presence of unchecked warnings. Erasure throws out  all type information between angle brackets. For example, List<String> is converted into List. All remaining uses of type variables are replaced by the upper bound type variable (usually Object). And, whenever the resulting code isn’t type-correct, a cast to the appropriate type is inserted.

 

       在旧代码中使用泛型代码。与上面情况类似,会出现unchecked warning.

 

7 Fine Print 美好蓝图?(搞不懂作者的意图)

   

       泛型类被所有的它的子类共享。

 

             

    List<String> l1 = new ArrayList<String>();

    List<Integer> l2 = new ArrayList<Integer>();

    assert(l1.getClass()==l2.getClass()); // return true

 

 

Note 8: 所有的泛型类拥有相同的runtime类(其实从上面一条可以知道),并且,静态变量和方法也会在类的实例间共享。这就是为何在静态方法、变量或初始化中引用类型参数是非法的。

原文:All instances of generics class have the same run-time class. As consequence, the static variables and methods of a class are also shared among all the instances. That’s why it is illegal to refer to the type parameters of a type declaration in a static method or initializer, or in the declaration or initializer of a static variable.

 

    另一个隐含的事实,是无法判断一个类是否instanceof 其泛型类。或类型转换一个对象到一个泛型类型。

 

             

    Collection<String> cs = new ArrayList<String>;

    if (cs instanceof Collection<String>) {} //非法

    (Collection<String>) cs; // unchecked warning

   

    <T>T badCast(T t, Object o) {return (T)o};// unchecked warning

 

 

Note 9: 类型变量在运行时不存在!这意味着泛型不会占用时间或空间的性能,但不幸的是,你不能可靠的使用类型转换。

原文:type variables don’t exist at run time. This means that they entail no performance overhead in either time nor space. It also means that you can’t reliably use them in casts.

 

数组可能无法成为一个参数类型。除非是一个通配符类型。

 

             

    List<String> [] lsa = new List<String>[10]; // 不允许

                     = new List<?>[10]; // 允许

    Object o = isa;

    Object[] oa = (Object[])o;

    oa[1] = new ArrayList<Integer>();

    String s = lsa[1].get(); //允许的情况下,runtime error

 

 

可以声明类型变量的数组,但是不能初始化(new)建立一个新数组。如new T[100],因为类型变量运行时并不存在。

 

 

词汇表:

参数类型:parameterized type,形如:new ArrayList<?>,new ArrayList<String>

类型变量:type variable,形如:<T> T getCollection()…

通配符类型:wildcard type,形如:new ArrayList<?>

有界通配符类型:bounded wildcard type,形如:new ArrayList<? extends Object>

原生类型:raw type,指在泛型代码中使用Collection, ArrayList等旧形式

未检查警告:unchecked warning,Java1.5代码安全警告。

 

To be continue ...

      

 

版权声明:

本文由冰云完成,首发于优快云,作者保留中文版权。

未经许可,不得使用于任何商业用途。

欢迎转载,但请保持文章及版权声明完整。

如需联络请发邮件:icecloud(AT)sina.com

 

浅谈什么是RRU和BBU RRU(远程射频单元)和BBU(基带处理单元)是基站建设中的关键组件,它们支持分布式架构,从而提高了效率和可靠性。RRU(射频拉远单元)和BBU(基带处理单元)是基站建设和光纤拉远(FTTA,Fiber To The Antenna)中不可或缺的组件。在分布式基站架构中,传统的宏基站设备根据其功能分为两个独立的单元:BBU和RRU。BBU集中了基站的“基带处理”、“传输”、“主控”、“时钟”等功能。而RRU则专注于射频(RF)设备,包括收发器和射频器件。 阅读详情

相关推荐

Spring Boot 实现多图片上传并回显,涨姿势了~

上传 Controller的代码非常简单,由于用了SpringMVC框架,所以直接用MultipartFile来接即可。由于是多图片上传所以用数组来接。此处应该注意参数名应该和<input>中的name值相对应: @RequestMapping("/pic") @ResponseBody publicResponseEntity<String>pic(MultipartFile[]pictures)throwsException{ ResponseEnti...

weixin_54556126的博客 893

什么是RRU和BBU

原文地址:https://wenku.baidu.com/view/6488e5397cd184254b3535d3.html RRU是Radio Remote Unit 射频拉远模块,它是将数字基带信号转换成高频(射频)信号,并将高频(射频)信号送到天线辐射出去。 BBU是Building Baseband Unit 室内基带处理单元。基带BBU集中放置在机房,RRU可安装至楼层,BBU与R...

dragon_cdut的博客 4万+

保姆级教程:在K230开发板上为张大头步进电机实现位置、速度、回零全功能控制

本文提供了一份详细的K230开发板与张大头步进电机的控制教程,涵盖硬件连接、协议解析、模块化代码实现及实战案例。通过位置、速度和回零功能的全面讲解,帮助开发者快速掌握步进电机的高级控制技术,适用于自动化、机器人等应用场景。

weixin_42629671的博客 708

5G--BBU RRU 如何演化到 CU DU?

NG-RAN 从LTE BBU 、RRU 到 CU DU的演进

qq_38480311的博客 7536

JSON(详解)

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它以易于阅读和编写的文本格式来存储和表示数据,通常用于在不同的系统之间进行数据交换。JSON数据以键-值对的形式组织,可以包含对象、数组、字符串、数字等基本数据类型。它经常在Web开发、API通信等领域被广泛使用。

7702

Quartus Prime v18.1 standard-QuartusPrimeV18.1标准版安装过程

Quartus Prime v18.1 standard安装破解过程 下载方式1:官网下载: https://fpgasoftware.intel.com/18.1/?edition=standard&platform=windows 下载方式2:可以从我的网盘下载安装包(如果链接未时效的话): 链接:https://pan.baidu.com/s/1bq4_FcNPSflU1zGJv__rvA 提取码:o0in ----------------------------------.

Alonger1988的博客 2万+

分布式基站中的BBU和RRU

分布式基站是相对于传统的宏基站来说的。 分布式基站一个典型的例子就是EnodeB(Evolutional Node B,LTE中的基站。) 分布式基站由两个主要的模块组成: BBU(Base Band Unit)和 RRU(Remote Raido Unit)射频拉远单元。基本思想就是说把基带和射频分开来处理,以达到分布式的效果,完成复杂区域(如大楼内部等)的覆盖工作。 BBU和RRU之间由...

Mike_Shine的博客 1万+

Winform利用动画控制实现各种特效

动画绘制控制类代码 using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Threading; using System.Windows.Forms; namespace Mengliao.CSharp.A14 { #region 动画类型枚举 // 本例为了简单起见没有使用见名知意的名称,如用于实际可将这些枚举成员更名

LilyCoder的博客 2501

泛型(Generics Types)学习笔记<一>

Generics Types 泛型学习笔记 1作者:冰云 icecloud(AT)sina.comBLOG: http://icecloud.51.net时间:2004.02.15 版权声明:本文由冰云完成,首发于优快云,作者保留中文版权。未经许可,不得使用于任何商业用途。欢迎转载,但请保持文章及版权声明完整。如需联络请发邮件:icecloud(A

冰云BLOG 4073

Android USB串口通信详解与实例

在Android开发中,USB串口通信是一个常见的需求,尤其是在与硬件设备进行交互时。通过USB串口,我们可以轻松地实现数据的发送与接收。本文将详细介绍如何使用库来实现Android设备与USB串口设备的通信。

m0_62153576的博客 677

目标检测YOLO实战应用案例100讲-【目标检测】缺陷检测(二)

在工业生产中总是经常遇到裂痕、划痕等产品的表面缺陷问题,机器视觉行业对于表面检测相比前几年已经有很大的突破,对于产品表面的划伤、污迹等检测已经不再是难点。在金属、玻璃、手机屏幕、液晶板等行业表面检测上应用广泛。但由于该类缺陷形状不规则、深浅对比度低,而且往往会被产品表面的自然纹理或图案所干扰。因此,表面划痕缺陷检测对于正确打光、相机分辨率、被检测部件与工业相机的相对位置、复杂的机器视觉算法等要求非常高。

qq_36130719的博客 728

Generics Types 泛型学习笔记<三>

Generics Types 泛型学习笔记作者:冰云 时间:2004-02-29联系:icecloud(AT)sina.comBlog:http://icecloud.51.net    真不好意思,这么久才提交上来,有些事情耽搁了。8 类文字?(Class Literals)作为运行时类型记号(Type Tokens)在1.5中,java.lang.Class是泛型的,即有一

冰云BLOG 4041

AS7341可见光谱传感器原理图设计,已量产(光线传感器)

最近在做便携式环境光光谱检测项目时,我们基于 ams 的 AS7341 搭了一套硬件电路 —— 这颗芯片算是业内新一代的光谱传感 IC,8 个可见光通道 + NIR + 闪烁检测的配置,加上 6 路并行 16 位 ADC,数据吞吐能力确实够顶。今天就拆解下这个模块的硬件设计细节,聊聊实际做板时的那些考量点。

不脱发的程序猿 639

Generics Types 泛型学习笔记

Generics Types 泛型学习笔记二>作者:冰云 时间:2004-02-24联系:icecloud(AT)sina.comBlog:http://icecloud.51.net首先我要特别感谢Schlemiel,他指出了类型协变的问题。其实我以前也看到过gigix翻译的那篇文,但是没看懂也没经大脑。经Schlemiel一提醒,我才意识到,这是泛型的规范。再翻出来看,如醍醐灌顶,真良师益

软件开发资料汇总 245

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Go 泛型(Generics)详解

/ 定义数字约束✅注意:约束本质是接口的联合类型(Union Types)。特性Go 泛型表现类型安全✅ 编译期检查性能✅ 零运行时开销代码复用✅ 显著减少重复学习成本⚠️ 需理解约束和类型参数适用场景容器、算法、中间件、工具库🌟记住泛型不是银弹,而是精准的手术刀。用对地方,事半功倍;滥用反而增加复杂度。

Aerkui的博客 2024

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

The Java™ Tutorials — Generics :Generic Types 泛型

The Java™ Tutorials — Generics :Generic Types 泛型 原文地址:https://docs.oracle.com/javase/tutorial/java/generics/types.html 关键点 如果利用Object来达到通用存储的目的,那么可能引起运行时错误泛型类格式:class name常见类型变量名:E(元素)、K(

FIRE_TRAY的Android之路 1420

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

服务器开发 的泛型(Generics)基础知识

泛型是一种允许定义类、接口和方法时不指定具体数据类型的特性,而是使用类型参数。当使用泛型时,实际的数据类型在使用时再被指定,这使得代码更加灵活,且可在多种不同的数据类型上进行操作。例如,在Java中,可以使用泛型来定义一个通用的列表:```java```在上述代码中,T是一个类型参数,表示泛型类型。我们可以在具体使用时指定T的实际类型,如。泛型作为一种强大的编程特性,在服务器开发中发挥着重要作用。它不仅提高了代码的复用性和可维护性,还增强了类型安全性。

2401_90031854的博客 1786

泛型(Generics)

 C# 2.0引入了很多语言扩展,最重要的就是泛型(Generics)、匿名方法(Anonymous Methods)、迭代器(Iterators)和不完全类型(Partial Types)。【一、基本概念】● 泛型允许类、结构、接口、委托和方法通过它们所存贮和操作的数据的类型来参数化。(也就是对数据类型进行参数化,类型也是变量,居然是什么类型要动态赋值)泛型是很有用的,因为它提供了更为强大的编译

doubleyou的专栏 693

Java泛型(Generics Type)

术语: formal parameters  形式参数 type parameters  类型参数 raw type 原型类型 1. 为什么使用泛型(Generics) 简单来说,泛型就是在定义类,接口和方法时,能够使用类型(classes和interface)作为参数。正如在方法定义中使用形式参数一样,泛型提供了一种在不同类型的输入情况下能够使用同样的方法代码。只是对于形式参数

maoyu123456789的专栏 624

CPT204-Advanced OO Programming: Generics 泛型

现在:`max2("Welcome", 23)` 变成了一个编译错误,因为`max`方法的两个参数必须具有相同的类型(例如,两个字符串或两个整数对象)Now: max2("Welcome", 23)becomes a Compiler Error because the two arguments of the max method must have the same type (e.g., two Strings or two Integer objects)

hhsstt__的博客 977

Phan类型系统深度解析:Union Types、Generics和Array Shapes

Phan作为PHP静态分析工具,其强大的类型系统是确保代码质量的核心。通过Union Types(联合类型)、Generics(泛型)和Array Shapes(数组结构)三大特性,Phan能够深入理解代码意图,发现潜在问题。🎯 ## 什么是Phan的Union Types? **Union Types(联合类型)** 是Phan类型系统的基石,它允许一个变量或返回值拥有多种可能的类型。比如

gitblog_00413的博客 738

Java集合和数据结构-详解泛型 (Generics)

本文全面解析Java泛型机制,涵盖从基础概念到高级应用的完整知识体系。主要内容包括:泛型类定义与使用、类型边界约束、通配符应用(PECS原则)、泛型方法实现、类型擦除机制及其限制,并通过一个完整的泛型二叉搜索树案例进行实践演示。文章重点阐释了泛型如何通过编译时类型检查确保类型安全,提升代码复用性,同时深入探讨了父子类型关系不变性、通配符的协变/逆变特性等高级主题。最后通过实现Comparable接口的泛型二叉搜索树,展示了如何综合运用类型边界和方法重载构建类型安全的数据结构。全文系统性地呈现了Java泛型的

道冲而用之或不盈,渊兮似万物之宗。 1360

30天学会Swift-14:泛型(Generics)

本文介绍了Swift中泛型编程的核心概念与应用。主要内容包括:1)泛型简介,说明泛型如何提高代码复用性和类型安全性;2)泛型函数的定义与使用,通过swapTwoValues示例展示类型参数的应用;3)泛型类型的实现,以Stack结构体为例;4)类型约束机制,演示如何通过协议或类限制类型参数;5)关联类型在协议中的使用,结合Container协议案例说明。文章还提供了实践练习,包括编写泛型函数来打印数组和获取中间元素。这些内容全面覆盖了Swift泛型编程的基础知识,帮助开发者编写更灵活、高效的代码。

smileKH的博客 530
上一篇: 泛型(Generics Types)学习笔记<一>
下一篇: 用PicoContainer和Nanning实现事务管理
icecloud
博客等级 码龄26年 160粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值