边界类型和静态字段访问

在 Java 的泛型中,边界类型是用来限制泛型参数的类型范围的。首先,我们定义两个类,它们都有一个静态字段:

public class Parent {
    public static final String FIELD = "Parent";
}

public class Child extends Parent {
    public static final String FIELD = "Child";
}

然后,我们定义一个泛型类,它尝试访问泛型参数的静态字段:

public class Container<T extends Parent> {
    public void printField() {
        System.out.println(T.FIELD);
    }
}

如果我们创建一个 Container 的实例,它的泛型参数是 Child,然后调用 printField 方法,它会打印"Parent",而不是"Child"

Container<Child> container = new Container<>();
container.printField(); // 输出"Parent"

这是因为在运行时,泛型参数 T 被擦除为它的边界类型 Parent,所以 T.FIELD 实际上是 Parent.FIELD。 如果我们需要访问 Child 的 FIELD 字段,我们应该直接访问它,而不是通过泛型参数来访问:

public class Container<T extends Parent> {
    public void printField() {
        System.out.println(Child.FIELD);
    }
}

现在,我们调用 printField 方法,它会打印"Child":

Container<Child> container = new Container<>();
container.printField(); // 输出"Child"

如果我们需要在 Container 类中根据泛型参数的实际类型做不同的处理,我们可以使用 instanceof 操作符来检查泛型参数的实际类型,然后根据实际类型做不同的处理。

public class Container<T extends Parent> {
    public void printField(T instance) {
        if (instance instanceof Child) {
            System.out.println(Child.FIELD);
        } else {
            System.out.println(Parent.FIELD);
        }
    }
}

现在,如果我们传递一个实例给 printField 方法:

Container<Parent> container = new Container<>();
container.printField(new Child()); // 输出"Child"
container.printField(new Parent()); // 输出"Parent"

总结:
由于 Java 的类型擦除机制,泛型参数的实际类型在运行时是不可知的。在运行时,所有的泛型参数都会被擦除为它们的边界类型。

  1. 不要在泛型类或方法中访问泛型参数的静态字段或方法。因为在运行时,泛型参数的静态字段或方法实际上是它的边界类型的静态字段或方法。
  2. 如果你需要访问一个特定类型的静态字段或方法,你应该直接访问它,而不是通过泛型参数来访问。
  3. 如果你需要在泛型类或方法中根据泛型参数的实际类型做不同的处理,你可以使用 instanceof 操作符来检查泛型参数的实际类型,然后根据实际类型做不同的处理。

本文链接:

https://pugqq.com/archives/boundary-type-and-static-field.html
边界类型和静态字段访问 - I/O
11 评论
    huzkizqbksSogo BrowserWindows 10
    11月22日 回复

    《你不是她》韩国剧高清在线免费观看:https://www.jgz518.com/xingkong/27907.html

    egtwkkwviuSogo BrowserWindows 10
    11月21日 回复

    你的文章充满了创意,真是让人惊喜。 http://www.55baobei.com/yzQsSeAO28.html

    daozzxjizySogo BrowserWindows 10
    11月21日 回复

    你的文章让我感受到了不一样的风景,谢谢分享。 https://www.4006400989.com/qyvideo/9355.html

    hhhzydbtwpSogo BrowserWindows 10
    11月15日 回复

    《洪熙官之天地英雄》动作片高清在线免费观看:https://www.jgz518.com/xingkong/22711.html

    ojjbnmdbhzSogo BrowserWindows 10
    11月13日 回复

    《洪熙官之天地英雄》动作片高清在线免费观看:https://www.jgz518.com/xingkong/22711.html

    dvddsfstttSogo BrowserWindows 10
    10月19日 回复

    文章的确不错啊https://www.cscnn.com/

    gfhcsgnahvSogo BrowserWindows 10
    10月5日 回复

    想想你的文章写的特别好www.jiwenlaw.com

    hirzgnjrfsSogo BrowserWindows 10
    10月4日 回复

    看的我热血沸腾啊https://www.ea55.com/

    shdcdagstxSogo BrowserWindows 10
    10月1日 回复

    想想你的文章写的特别好https://www.237fa.com/

    whooqqkqrsSogo BrowserWindows 10
    9月23日 回复

    叼茂SEO.bfbikes.com

    ekfthihhuoSogo BrowserWindows 10
    9月23日 回复

    不错不错,我喜欢看

# 最近更新

Nginx的proxy_pass指令完全拆解2021-03-21

Nginx配置Jenkins域名访问2021-01-03

设计模式 - 浅谈备忘录模式2020-12-02

设计模式 - 浅谈中介者模式2020-11-23

设计模式 - 浅谈迭代器模式2020-11-02

MySQL5.7 字符集设置2020-10-26

设计模式 - 浅谈状态模式2020-10-23

设计模式 - 浅谈访问者模式2020-10-13

设计模式 - 浅谈观察者模式2020-10-12

设计模式 - 浅谈命令模式2020-09-21