簡體   English   中英

如何正確使用構造函數?

[英]How to correctly use constructors?

嗨,我是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_UNAVAILLABLE(0x80100017)

我嘗試為它們中的每個添加SCARD_S_SUCCESS(0x0L){},但是它沒有解決錯誤。 我也嘗試將它們添加為參數,但這沒有用。 有人可以幫忙嗎?

您只有一個接受int的構造函數:

private SCardErrors(int value)

...但是您嘗試使用long類型的參數來調用它:

SCARD_S_SUCCESS(0x0L)

您要么需要更改構造函數以接受long (可能還更改了字段類型),要么將參數更改為int值。 並非所有的參數都可以表示為int (例如0x80100017L)-但是,如果您只關心所涉及的位,並且不介意值變為負數,則可以將其強制轉換為int並仍然具有相同的32位...

Java找不到構造函數的原因是,您在所有數字文字上使用了L后綴,使它們變long ,而不是int Java不允許在沒有顯式強制轉換的情況下將long轉換為int ,因此編譯器無法在這種情況下應用采用int的構造函數(反之亦然,即將int傳遞給期望long的方法或構造函數,工作)。

您可以通過將編譯器更改為long並使用longValue代替intValue來解決此問題:

private long longValue;
private static java.util.HashMap<Long, SCardErrors> mappings;
private static java.util.HashMap<Long, SCardErrors> getMappings()
{
    if (mappings == null)
    {
        synchronized (SCardErrors.class)
        {
            if (mappings == null)
            {
                mappings = new java.util.HashMap<Long, SCardErrors>();
            }
        }
    }
    return mappings;
}

private SCardErrors(long value)
{
    longValue = value;
    getMappings().put(value, this);
}

public long getValue()
{
    return longValue;
}

public static SCardErrors forValue(long value)
{
    return getMappings().get(value);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM