如何正确使用构造函数?

时间:2014-10-22 16:07:23

标签: java constructor

您好我是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){                        } 对于他们每个人,但它没有修复错误。我也尝试将它们添加为参数,但这不起作用。有人可以帮忙吗?

2 个答案:

答案 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