在类型化映射中插入值

时间:2018-08-01 03:31:13

标签: java generics

为什么以下代码在尝试添加到地图时会导致以下错误?

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 {
}

有什么想法吗?

1 个答案:

答案 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. )进行编译-并带有警告,但这是不安全的,并且可能不是通用方法的重点。