为什么以下代码在尝试添加到地图时会导致以下错误?Wrong 1st argument type. Found: 'com.test.Test.SomeEnums', required 'T'
public class Test {
public enum SomeEnums implements SomeType {
A;
public <T extends Enum<T> & SomeType> Map<T, Object> buildMap() {
Map<T, Object> map = new HashMap<>();
map.put(SomeEnums.A, new Object());
return map;
}
}
}
public interface SomeType {
}
有任何想法吗?
最佳答案
问题是map.put(SomeEnums.A, new Object())
对于Map<T, Object>
并不总是安全的。尽管SomeEnums
是extends Enum<T> & SomeType
的有效替代品,但它并不总是具体的类型参数。
例如,考虑第二个枚举:
enum OtherEnum implements SomeType {
B;
}
如果要调用相同的方法:
Map<OtherEnum, Object> otherMap = Test.SomeEnums.A.buildMap();
给定
buildMap()
的签名,这是一个有效的调用。但是,问题在于该方法添加了错误的映射键:map.put(SomeEnums.A, new Object());
//SomeEnums.A is not always of type <T>, so this is not allowed.
该代码将使用类型强制转换(
map.put((T) SomeEnums.A, new Object())
)进行编译-并带有警告,但这是不安全的,并且可能不是通用方法的重点。