通配符和泛型方法之间的区别? [Java]
Differences between Wildcard and generic methods? [Java]
我不明白这两种模式之间的区别。通配符只能扩展我的 类 而不是泛型方法吗?但我不认为这是答案。
Java中的通配符表示未知类型,可作为return类型使用。引用OracleJava教程中给出的解释:
The wildcard can be used in a variety of situations: as the type of a parameter, field, or local variable; sometimes as a return type (though it is better programming practice to be more specific). The wildcard is never used as a type argument for a generic method invocation, a generic class instance creation, or a supertype. See this
假设你有一个 List<String>
,你会尝试将它传递给接受 List<Object>
的方法,它不会编译(Java 试图保护你免于创建一个此处为运行时异常)。但是,如果您将它传递给接受 List<?>
的方法,它就会这样做。这可能会让您了解通配符的用处。
关键字 extends
用于具有上限的通配符,例如List<? extends Object>
。还有一个带下限的通配符:List<? super String>
.
如果没有通配符,泛型的整个主题将变得不那么有趣,因为泛型被视为对象(类型擦除)。这意味着可供他们使用的方法并不多。通配符通过限制类型来解决这个问题(因此指定了一个公共接口,其中包括一组可以在对象上调用的公共方法)。
我不明白这两种模式之间的区别。通配符只能扩展我的 类 而不是泛型方法吗?但我不认为这是答案。
Java中的通配符表示未知类型,可作为return类型使用。引用OracleJava教程中给出的解释:
The wildcard can be used in a variety of situations: as the type of a parameter, field, or local variable; sometimes as a return type (though it is better programming practice to be more specific). The wildcard is never used as a type argument for a generic method invocation, a generic class instance creation, or a supertype. See this
假设你有一个 List<String>
,你会尝试将它传递给接受 List<Object>
的方法,它不会编译(Java 试图保护你免于创建一个此处为运行时异常)。但是,如果您将它传递给接受 List<?>
的方法,它就会这样做。这可能会让您了解通配符的用处。
关键字 extends
用于具有上限的通配符,例如List<? extends Object>
。还有一个带下限的通配符:List<? super String>
.
如果没有通配符,泛型的整个主题将变得不那么有趣,因为泛型被视为对象(类型擦除)。这意味着可供他们使用的方法并不多。通配符通过限制类型来解决这个问题(因此指定了一个公共接口,其中包括一组可以在对象上调用的公共方法)。