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

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

09-25 19:00