Как я могу привести от int к универсальному типу Integer? - PullRequest
0 голосов
/ 24 апреля 2010

Я относительно новичок в Java и привык к обобщению в C #, поэтому немного боролся с этим кодом. По сути, я хочу универсальный метод для получения сохраненного предпочтения Android по ключу, и этот код, хотя и некрасиво, работает для логического, но не целого числа, когда он взрывается с ClassCastException. Может кто-нибудь сказать мне, почему это неправильно и, возможно, помочь мне улучшить всю рутину (с использованием подстановочных знаков?)?

    public static <T> T getPreference(Class<T> argType, String prefKey, T defaultValue,
        SharedPreferences sharedPreferences) {

    ...

    try {
        if (argType == Boolean.class) {
            Boolean def = (Boolean) defaultValue;
            return argType.cast(sharedPreferences.getBoolean(prefKey, def));
        } else if (argType == Integer.class) {
            Integer def = (Integer) defaultValue;
            return argType.cast(new Integer(sharedPreferences.getInt(prefKey, def)));
        } else {
            AppGlobal.logWarning("getPreference: Unknown type '%s' for preference '%s'. Returning default value.",
                    argType.getName(), prefKey);
            return defaultValue;
        }
    } catch (ClassCastException e) {
        AppGlobal.logError("Cast exception when reading pref %s. Using default value.", prefKey);
        return defaultValue;
    }
}

Мой телефонный код:

        mAccuracy = GlobalPreferences.getPreference(Integer.class, prefKey, mAccuracy, sharedPreferences);

Вот код Android для getInt ():

public int getInt(String key, int defValue) {
        synchronized (this) {
            Integer v = (Integer)mMap.get(key);
            return v != null ? v : defValue;
        }
    }

Я пробовал разные способы - использование встроенного int, приведение к Integer, но ничего не работает.

Ответы [ 3 ]

0 голосов
/ 24 апреля 2010

Попробуйте определить набор функций с одинаковыми именами, которые по умолчанию принимают другой тип, и дайте компилятору понять это. Java действительно связывает вам руки при работе с типами, особенно примитивными типами.

public function int getPreference( String key , int missing ) { return sharedPreferences.getInt( key , missing ); }
public function boolean getPreference( String key , boolean missing ) { return sharedPreferences.getBoolean( key , missing ); }
public function String getPreference( String key , String missing ) { return sharedPreferences.getString( key , missing ); }

Edit:

Если вы пытаетесь получить объект (не примитив) независимо от типа, вы можете использовать:

public function Object getPreference( String key , Object missing ) { return sharedpreferences.contains( key ) ? sharedPreferences.getAll().get( key ) : missing; }

Если вы пытаетесь получить определенный тип, например int, независимо от того, что хранится, вы можете использовать:

public function int getPreference( String key , int missing ) {
    int result = missing;
    Object value = sharedpreferences.contains( key ) ? sharedPreferences.getAll().get( key ) : null;
    if ( value instanceof Integer ) result = ((Integer)value).intValue();
    if ( value instanceof Boolean ) result = ((Boolean)value).booleanValue() ? 1 : 0;
    // repeat for every other primitive wrapper type you care about
    return result;
}

Если вы пытаетесь получить результат, только если это определенный тип, вы можете использовать что-то вроде:

public function Object getPreference( Class inRequire , String key , Object missing ) {
    Object value = sharedpreferences.contains( key ) ? sharedPreferences.getAll().get( key ) : null;
    if ( !( value instanceof inRequire ) ) {
        value = null;
    }
    return ( value == null ) ? missing : value;
}
0 голосов
/ 24 апреля 2010

Оказывается, предпочтение, которое я пытаюсь прочитать, хранится в виде строки, поэтому исключение приведения происходит изнутри кода Android, а не моего. Спасибо за вашу помощь. Но так как я новичок в Java, если вы думаете, что с моей рутиной вообще что-то не так, пожалуйста, научите меня лучше.

0 голосов
/ 24 апреля 2010

Могу ли я предложить:

Integer i = new Integer(42);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...