瞎扯淡:Java 泛型编程 - 泛型类型

本贴最后更新于 3059 天前,其中的信息可能已经物是人非

定义:Java 中,泛型类型就是对 Java 中普通类和接口进行基于类型的参数化。可以用来表示 TypeName of T 的概念。

书写格式:

class TypeName<T>{ /*内容*/ }``` 比如,我们来表示一瓶液体,可以是纯净水,也可以是其他

public class Bottle {

private T t;

public void fillWith(T t) {
this.t = t;
}

public void showType() {
System.out.println("瓶里装的是:" + t.getClass().getName());
}
} ```
接口 Interface 写法相同。

我们来编写一个测试例子,主程序:

public class TestGenericTypes { public static void main(String[] args) { Bottle ba = new Bottle<>(); ba.fillWith(new OrangeJuice()); ba.showType(); Bottle bb = new Bottle<>(); bb.fillWith(new PureWater()); bb.showType(); } }

OrangeJuice:

public class OrangeJuice { private String name = "OrangeJuice"; public String getName() { return name; } }``` PureWater类似,就不赘述。运行主程序,得到:

瓶里装的是:OrangeJuice

瓶里装的是:PureWater

#### 注意:从Java7开始,泛型在使用时,新建对象时可以不在<>中书写具体的对象名,因为编译器会进行自动类型推断。 #### 复合类型参数 如果你以为,泛型类型不过如此,那就错了,如何编写复合类型的泛型类型,请看下面的例子。 先定义一个泛型接口:

public interface Carrer {
public K getKey();
public V getValue();
}

然后定义一个类MyCarrer,实现该接口:

public class MyCarrer implements Carrer {

private K k;
private V v;

public MyCarrer(K k, V v) {
this.k = k;
this.v = v;
}

@Override
public K getKey() {
return k;
}

@Override
public V getValue() {
return v;
}
}

在之前的TestGenericType测试主程序:

public class TestGenericTypes {

public static void main(String[] args) {
// JDK7 之后,由于编译器会进行类型推断,新建对象时 <> 内的内容可写可不写,但写出来是一个好习惯
Carrer c1 = new MyCarrer("Student",10);
Carrer c2 = new MyCarrer("ITer","six or seven years");
// 泛型中可以嵌套泛型使用
Carrer> c3 = new MyCarrer<>("ITer",new Bottle());
}
}

#### rawTypes rawtypes,从字义上讲叫"半成品类型",在使用泛型类的时候,如果不在<>中指明泛型类的具体参数类型,那么这就是rawtypes。比如这样:

Bottle bb = new Bottle();

这样

Bottle bb = new Bottle();

甚至这样

Bottle bb = new Bottle();

上述的写法,会产生编译警告,需要@SuppressWarnings("rawtypes")进行警告去除,但不建议这样做,因为编译器不会对基本类型Bottle进行类型安全检查。建议这样写:

Bottle bb = new Bottle ();

#### 类型参数的命名规范 + E - Element (广泛用于Java集合框架) + K - Key + N - Number + T - Type + V - Value + S,U,V etc. - 2nd, 3rd, 4th 类型 翻看JDK源代码,可以发现很多类的实现都采用了泛型技术,比如集合类、容器类等。泛型是Java中极其重要的技术,用好泛型非常有利于写出优雅的代码,下一篇写写泛型方法。
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖 • 3 关注
  • 泛型
    7 引用 • 7 回帖
  • 瞎扯淡
    4 引用 • 10 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 3 关注
  • 导航

    各种网址链接、内容导航。

    45 引用 • 177 回帖
  • OpenCV
    15 引用 • 36 回帖 • 7 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    246 引用 • 1338 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 248 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 614 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 490 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 820 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 385 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 191 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 628 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    26030 引用 • 108025 回帖
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 145 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 5 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    29 引用 • 230 回帖 • 124 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 260 关注
  • RemNote
    2 引用 • 16 回帖 • 22 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    77 引用 • 37 回帖 • 1 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 229 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 120 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖 • 1 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    171 引用 • 1537 回帖