Blog

使用 Generic 的限制

Generic 使用的限制 #

  1. 原生数据类型不能用到 Type 参数中。写 Pair<double> 会出错,而应使用 Pair<Double>。

  2. 运行时类型检测只对 Raw Type 起作用。

    if (a instanceof Pair<String>)
    

    与下面的写法是完全一样的:

    if (a instanceof Pair<T>)
    

    Type 参数会被忽略,另一种写法是:

    if (stringPair.getClass() == employeePair.getClass())
    
  3. Throw 和 Catch 语句中不能使用 Generic 类型。

    public class Problem<T> extends Exception { /* . . . */ } // ERROR--can't extend Throwable
    
  4. 数组中不能使用 Type 参数。

    Pair<String>[] table = new Pair<String>[10]; // ERROR
    
  5. Type 变量不能实例化。

    public Pair() { first = new T(); second = new T(); } // ERROR
    

    必须通过反射才能创建 Type 对应的实例。参看 Core Java I 8th 第628页。

    ...

根据 Generic Type 生成对应的 Raw Type

Content #

JVM 虚拟机的角度来看,并不存在 Generic Type。定义新的 Generic Type,会自动生成对应的 Raw Type。

Raw Type 的名字和 Generic Type 的名字相同,并把 Type Variable 替换成 Bounds List 中的第一个 Type(没有显式声明 Bounding Type 的话就使用 Object )。使用过程中碰到 Generic Type,编译器会先调用 Raw Type 对应的方法,然后添加强制类型转换。

Generic Type 在 Java 中只是用编译器自动添加的强制类型转换代替了程序员的强制类型转换。

考虑下面的 Generic Type:

public class Interval<T extends Comparable & Serializable> implements Serializable
{
    public Interval(T first, T second)
    {
        if (first.compareTo(second) <= 0) { lower = first; upper = second; }
        else { lower = second; upper = first; }
    }
    . . .
    private T lower;
    private T upper;
}

由 Interval 生成的 Raw Type 会是下面这个样子:

...

Bounds for Type Variables

Bounds for Type Variables #

public static <T extends Comparable> T min(T[] a) . . .
T extends Comparable & Serializable

使用 extends 而不用 implements 是为了不引入新的关键词。在限定 Type 变量的范围时,可以使用多个接口,但只能有一个类,并且类必须是 Bounds List的第一个。

From #

并发与并行

Content #

并发(Concurrency)系统是指系统支持两个或多个动作同时存在。并行(Parallelism)是指系统支持两个或多个动作同时执行。

单个CPU永远无法同时执行两个或两个以上的任务,但是允许任务同时存在,因此只会有并发行为。只有多核或多个CPU才可能发生并行。

GC算法中的并发与并行 Python中的并发和并行

普通类中的Generic方法

Generic Method #

Generic类中的Generic方法和普通类的Generic方法在写法上有所不同,下面的代码演示的是普通类中的Generic方法。

class ArrayAlg
{
        public static <T> T getMiddle(T[] a)
        {
                return a[a.length / 2];
        }
}

调用时可以写成这样:

String[] names = { "John", "Q.", "Public" };
String middle = ArrayAlg.<String>getMiddle(names);

调用时getMiddle方法之前的<String>可以省略。

From #

sub:Generic Programming in Java

Generic的四个要点 #

  1. 虚拟机的角度来看并不存在 generic,只有普通的类的方法。 There are no generics in the virtual machines, only ordinary classes and methods.
  2. 所有 Type 参数都会用 Bounds 来替换。 All type parameters are replaced by their bounds.
  3. 为了维护多态机制,编译器会自动添加 Bridge 方法。 Bridge methods are synthesized to preserve polymorphism.
  4. 强制类型转换会由编译器自动插入。 Casts are inserted as necessary to preserve type safety.

根据 Generic Type 生成对应的 Raw Type 使用 Generic 的限制

Wildcard Type #

ArrayList有addAll方法,可以把ArrayList<Manager>所有元素加到ArrayList<Employee>中,但反过来却并不应该成立。为了解决这样的问题,Java语言的设计者发明了Wildcard Type来解决这类问题。 the generic class acts as a factory for ordinary classes. wildcards with supertype bounds let you write to a generic object, wildcards with subtype bounds let you read from a generic objects.

...

sub:lvm

Content #

lvextend不会丢数据,lvreduce可能会导致整个磁盘的文件不能用? #

lvm lvextend -L +1G vg_cent2/lv_home
resize2fs /dev/mapper/vg_cent2-lv_home

为根文件系统所在在lv改名 #

如果lvrename更改的logical volume正好是根文件系统,那么,只更新 /etc/fstab是不够的,往往还要改grub的配置,要不然grub将无法加载根文件系统。

扩展根文件系统所在lv容量 #

如果是ext3,内核在2.6及以上,则可在线resize2fs,在线即可扩展。扩展根文件系统,使用所有空闲空间:

lvextend -l +100%FREE /dev/mapper/vg_moodle-lv_root

用resize2fs在线扩展文件系统容量:

resize2fs /dev/mapper/vg_moodle-lv_root

减少根文件系统所在lv容量 #

需要unmount根文件系统,系统启动进入rescue模式,步骤如下:

  • 验证磁盘上的lvm结构的正确性

    pvscan,vgscan,lvscan
    
  • 激活逻辑卷

    lvchange -ay /dev/VolGroup00/LogVol00
    
  • 减少文件系统和逻辑卷的大小

    e2fsck -f /dev/VolGroup00/LogVol00
    resize2fs /dev/VolGroup00/LogVol00 3000M
    lvreduce -L 3000M /dev/VolGroup00/LogVol00
    

    或者先用lvreduce,然后用不跟size参数的resize2fs。尤其要小心size参数指定,如果不对可能会导致文件系统破坏。

  • 验证

    vgdisplay,lvdisplay
    

添加新硬盘 #

vgextend vg0 /dev/sdb
lvcreate -L 10G -i 2 --type striped -n lv_data vg0

查看lv设置的参数

...

清除水垢

Content #

不锈钢及玻璃容器是盛装饮用水的最理想介质,不锈钢水壶用久了,会出现水垢,以下介绍几条清除水垢小帖士:

1、 将3小杯白醋注入水壶中,再加水注满,保持一整夜(请勿煮沸),第二天倒掉,将水壶注满水,烧开倒掉,重复数次。 2、 平时煮水时,可放入一小片柠檬,可令水壶不易生成水垢。 3、 削土豆剩下的土豆皮放入壶里,倒入水没过土豆皮,加热烧开后把壶里的东西倒出,里面的水垢混杂在土豆皮里一起出来了,水壶干净了。

From #

开机强制检测硬盘(fsck)

Content #

The only thing you need to do is create a file called forcefsck in the root partition of your system.

# touch /forcefsck

From #