【发布时间】:2017-05-17 18:14:56
【问题描述】:
使用以下方法定义:
protected <T extends Enum<T>> Tuple4< Boolean, String, T, String> foo( T... args ) {
...
}
(即接受任何类型的 Enum 作为参数的方法,在内部使用它并返回此类的实例)
并将其用作:
protected String bar( Enum<?>... args ) {
...
foo( args );
...
编译器抱怨:
error: method foo in class xxxx cannot be applied to given types;
但是,如果我更改“foo”声明,请使用 Enum 而不是 Enum,如下所示:
protected <T extends Enum<?>> Tuple4< Boolean, String, T, String> foo( T... args ) {
...
}
一切正常。
我不明白第一个错误的来源以及编写此代码的最佳方法。
在“foo”中使用术语“
(注意:假设“bar”的实现可以改变,但它的声明不能改变)。
【问题讨论】:
-
阅读泛型与通配符的主题,我相信这与传递给
foo的args是根据Enum<?>而不是@ 定义的事实有关987654328@ -
你正在处理一个枚举类型“?”和一个枚举类型“T”。它们不一样,这就是为什么你会得到基于类型的错误
-
@Rocket6488: 是的,这是新的坏消息,哪个是好消息?
-
根据您制定的规则,您必须将可更改的定义更改为可更改的定义