java - 捕获 Java 泛型中的通配符

标签 java generics wildcard inference

来自 this Oracle Java 教程:

The WildcardError example produces a capture error when compiled:

public class WildcardError {

    void foo(List<?> i) {
        i.set(0, i.get(0));
    }
}

在此错误演示之后,他们使用辅助方法解决了问题:

public class WildcardFixed {
    void foo(List<?> i) {
        fooHelper(i);
    }

    // Helper method created so that the wildcard can be captured
    // through type inference.
    private <T> void fooHelper(List<T> l) {
        l.set(0, l.get(0));
    }
}

首先,他们说列表输入参数 ( i ) 被视为 Object :

In this example, the compiler processes the i input parameter as being of type Object.

那为什么 i.get(0)不返回 Object ?如果它已经这样传入了?

此外,使用 <?> 的意义何在?什么时候你必须使用辅助方法使用 <T> .直接用T会不会更好可以推断出哪些?

最佳答案

List<?>确实意味着未知类型的对象列表,它与 List<Object> 不同.

因为我们不知道i.get(0)的列表结果中元素的类型被 Java 视为 Object , 你不能添加 ObjectList<?> .如果您的 Java 可以更智能,但代码更复杂,请使用 <?>通配符很容易使其成为非类型安全的。

关于java - 捕获 Java 泛型中的通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17340474/

相关文章:

JAVA 评估后缀表达式——无法抛出空或无效表达式

java - OrthogonalTiledMapRenderer 和正常的 Spritebatch 渲染一个白框?

TypeScript Omit 和 keyof

c# - 使用多重匹配和通配符查询

windows - grep 类似 findstr 的语法

Java 简单 XML 转换器将元素写入 OutputNode

java - 当我刷新浏览器时看不到变化 - Java EE Web 应用程序。 + Glassfish 4 + Netbeans + Java 7 + Mac 操作系统-

scala - 引用由抽象类型成员遮蔽的泛型类型参数

c# - 通用委托(delegate),C# 3.5

c# - Xpath 通配符(例如 : "/Data/Customers/D*")