您好我是Java的新手,构造函数仍然在困惑我。我正在尝试创建和枚举如下:
public enum SCardErrors
{
SCARD_S_SUCCESS(0x0L),
SCARD_E_SHARING_VIOLATION(0x8010000BL),
SCARD_E_NO_READERS_AVAILABLE(0x8010002EL),
SCARD_E_READER_UNAVAILABLE(0x80100017L);
private int intValue;
private static java.util.HashMap<Integer, SCardErrors> mappings;
private static java.util.HashMap<Integer, SCardErrors> getMappings()
{
if (mappings == null)
{
synchronized (SCardErrors.class)
{
if (mappings == null)
{
mappings = new java.util.HashMap<Integer, SCardErrors>();
}
}
}
return mappings;
}
private SCardErrors(int value)
{
intValue = value;
getMappings().put(value, this);
}
public int getValue()
{
return intValue;
}
public static SCardErrors forValue(int value)
{
return getMappings().get(value);
}
}
从上面它给出了错误,即构造函数SCardErrors(long)未定义为行: SCARD_S_SUCCESS(0x0L) SCARD_E_SHARING_VIOLATION(0x8010000BL) SCARD_E_NO_READERS_AVAILABLE(0x8010002EL) SCARD_E_READER_UNAVAILABLE(0x80100017L);
我试过加入 SCARD_S_SUCCESS(0x0L){ } 对于他们每个人,但它没有修复错误。我也尝试将它们添加为参数,但这不起作用。有人可以帮忙吗?
答案 0 :(得分:2)
您只有一个构造函数接受int
:
private SCardErrors(int value)
...但您尝试使用long
类型的参数调用它:
SCARD_S_SUCCESS(0x0L)
您需要更改构造函数以接受long
- 并且可能也会更改字段类型 - 或者将参数更改为int
值。并非所有参数都可以表示为int
(例如0x80100017L) - 但是如果您只关心所涉及的位,并且不介意值变为负值,则可以转换为int
并且仍然有相同的32位...
答案 1 :(得分:1)
Java找不到构造函数的原因是您在所有数字文字上使用了L
后缀,使其成为long
,而不是int
。如果没有显式转换,Java不允许将long
转换为int
,因此编译器无法应用在这种情况下采用int
的构造函数(反过来,即传递{ {1}}对于期望int
的方法或构造函数,可能会有效。)
您可以通过更改编译器以使用long
并使用long
代替longValue
来解决此问题:
intValue