为什么以下代码在尝试添加到地图时会导致以下错误?
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 {
}
有什么想法吗?
答案 0 :(得分:1)
问题在于AbpODataEntityController
对于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.
)进行编译-并带有警告,但这是不安全的,并且可能不是通用方法的重点。