Real 焜

Stay Simple. Stay NexT.

你有没有变得越来越想去旅行?

随着年龄的增长,工作和生活的压力越来越大,很多人发现自己对旅行的渴望也越来越强烈。为什么会这样呢?本文将从心理学和社会学的角度,深入分析现代人为什么总是想去旅行。

写这些文章的初衷是什么?

中文世界的Java教材亦或者视频教程使用的JDK版本大多比较滞后,且带有传统编程思维的局限性(从面向过程到面向对象的转变)。内容编排和知识体系也比较陈旧,无法和英文世界的Java知识体系接轨。因此我决定梳理自己的Java知识体系,分享给大家。Java语言的内容翻译自 dev.java,内容非常棒。

主要针对哪些问题?

  1. 碎片化的Java知识体系
  2. 过时的Java编程思维
阅读全文 »

注解

注释有多种用途,其中包括:

  • 编译器信息——注释可供编译器用于检测错误或抑制警告。
  • 编译时和部署时处理——软件工具可处理注释信息以生成代码、XML文件等。
  • 运行时处理——某些注解可在运行时进行检查。

本节说明注解的使用场景、应用方式、Java平台标准版(Java SE API)中可用的预定义注解类型,以及如何结合可插拔类型系统使用类型注解来编写具有更强类型检查能力的代码,并介绍了如何实现重复注解。

阅读全文 »

无法使用基本类型实例化泛型类型

考虑以下参数化类型:

class Pair<K, V> {

    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    // ...
}
阅读全文 »

泛型类的类型擦除

泛型被引入Java语言,旨在提供更严格的编译时类型检查并支持泛型编程。为实现泛型,Java编译器通过类型擦除对以下内容进行处理:

  • 将泛型类型中的所有类型参数替换为其边界,若类型参数未受限制则替换为Object。因此生成的字节码仅包含普通类、接口和方法。
  • 如有必要,插入类型转换以保持类型安全。
  • 生成桥接方法以在扩展泛型类型中保持多态性。
    类型擦除确保参数化类型不会创建新类;因此泛型不会产生运行时开销。
阅读全文 »

上界通配符

您可以使用上界通配符来放宽对变量的限制。例如,假设你想编写一个同时适用于 List<Integer>List<Double>List<Number> 的方法;你可以通过使用上界通配符来实现。
要声明一个上界通配符,请使用通配符字符(’?‘),后跟 extends 关键字,再后跟其上界。请注意,在此上下文中,extends 以一般意义使用,既表示“extends”(如类),也表示“implements”(如接口)。

阅读全文 »

类型推断和泛型方法

类型推断是Java编译器通过分析每个方法调用及其对应声明,来确定使该调用成立的类型实际参数的能力。推断算法会确定参数的类型,并在条件允许时确定结果被赋值或返回的类型。最后,推断算法会尝试找出能与所有参数兼容的最具体类型。
为说明最后一点,在下例中,推断机制判定传递给 pick 方法的第二个实参属于 Serializable 类型:

static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>());
阅读全文 »

为什么要使用泛型?

简而言之,泛型使类型(类和接口)能够在定义类、接口和方法时作为参数使用。这类似于方法声明中更常见的形式参数,类型参数让你能够通过不同的输入来复用相同的代码。区别在于:形式参数的输入是值,而类型参数的输入是类型。

阅读全文 »

将接口作为类型

定义新接口时,您实际上是在定义一种新的引用数据类型。接口名称可在任何可使用其他数据类型名称的位置使用。若定义类型为接口的引用变量,则赋值给该变量的任何对象都必须是实现该接口的类的实例。
例如,以下是一种在任意对象对中查找最大对象的方法,适用于从实现 Relatable 接口的类实例化的所有对象:

public Object findLargest(Object object1, Object object2) {
   Relatable obj1 = (Relatable)object1;
   Relatable obj2 = (Relatable)object2;
   if ((obj1).isLargerThan(obj2) > 0)
      return object1;
   else 
      return object2;
}
阅读全文 »

定义Relatable接口

要声明实现接口的类,需在类声明中包含一个 implements 子句。一个类可以实现多个接口,因此 implements 关键字后需跟随由逗号分隔的该类所实现接口的列表。按惯例,如果存在 extends 子句,则 implements 子句应紧随其后。

考虑一个定义如何比较对象大小的接口。

public interface Relatable {

    // this (object calling isLargerThan())
    // and other must be instances of 
    // the same class returns 1, 0, -1 
    // if this is greater than, 
    // equal to, or less than other
    public int isLargerThan(Relatable other);
}

若需比较相似对象的大小(无论对象类型如何),则实例化这些对象的类应实现 Relatable 接口。

阅读全文 »