繁体   English   中英

适用于任何列表和泛型/类型擦除方面的方法

[英]Method that works with any List and Generics/Type Erasure aspects

首先,创建一些代码(Java 7)只是为了说明我的问题。

import java.util.*;

class Generics101 {



    public static void addTrue(List list) {
        list.add(true);
    }

    public static void main(String[] args) {
        List<Integer> testList = new ArrayList<>();

        addTrue(testList);
        System.out.println(testList.get(0));

        // testList.add(true);  // will not compile when uncommented

    }
}

我有以下两个问题:

  1. addTrue方法中,Eclipse暗示它不喜欢raw types 当我尝试更改方法参数以使用通配符List<?> list ,它将无法编译。 我浏览了泛型教程,但找不到答案。 我在这里想念的是什么?

  2. 同一教程指出“ Java语言引入了泛型以在编译时提供更严格的类型检查... ”,我知道由于type erasure这种强制不能在运行时发生,因此我的上述代码可以编译并运行。 如果注释行未注释,它将触发编译错误,因此我认为在同一方法中将执行tighter type checks 此类执法的确切范围是什么? 它是如何正式定义的?

当我尝试更改方法参数以使用通配符列表时,它将无法编译。

它不会编译,因为您不能在List<?>添加任何内容。 因为您不知道实际上是哪种类型的List 例如,仅考虑当前情况。 您正在传递List<Integer> 它将成功传递到List<?> 没有问题。 但是您要向其中添加一个boolean类型true 如果编译器允许,它将在运行时引发ClassCastException 因此,这是不允许的。

因此,我假设在同一方法中将执行更严格的类型检查。 此类执法的确切范围是什么?

不,不是那样的。 不是在一定范围内进行类型检查。 无论使用泛型,它都会强制执行。 如果与正确的泛型一起使用,当前的代码将无法编译,因为您正在尝试将boolean类型添加到List<Integer> 您为什么期望它能起作用?

尝试将您的方法更改为通用方法,您会发现它无法编译:

public static <T> void addTrue(List<T> list) {
    list.add(true);  // Won't compile
}

我浏览了泛型教程,但找不到答案。 我在这里想念的是什么?

好吧,这是Oracle的标准教程。 那是您应该阅读的地方。 除此之外,您还可以在Java Generics FAQs-Angelika Langer上浏览一个非常好的泛型教程集

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM