1. Java / Говнокод #16277

    +73

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    @SuppressWarnings("unchecked")
    	private <T> T convert(final String p, final Class<T> type) {
    		if (p == null) {
    			return null;
    		}
    		if (type == String.class) {
    			return (T) String.valueOf(p);
    		} else if (type == Integer.class) {
    			return (T) Integer.valueOf(p);
    		} else if (type == Boolean.class) {
    			return (T) Boolean.valueOf(p);
    		} else if (type == Double.class) {
    			return (T) Double.valueOf(p);
    		} else if (type == Long.class) {
    			return (T) Long.valueOf(p);
    		} else if (type == Float.class) {
    			return (T) Float.valueOf(p);
    		} else if (type == Short.class) {
    			return (T) Short.valueOf(p);
    		} else if (type == Byte.class) {
    			return (T) Byte.valueOf(p);
    		}
    		throw new UnsupportedOperationException(String.format("Cannot convert \"%s\" to %s", p, type));
    	}

    распарсь мне строку...

    Запостил: Lure Of Chaos, 04 Июля 2014

    Комментарии (32) RSS

    • // не рефлексию же использовать
      Ответить
    • return T.valueOf(p) в жабе же не получится написать?
      Ответить
      • нет, но при желании можно залезть в type рефлексией и попробовать отыскать статический метод valueOf.

        только какой в этом смысл, если вместо
        convert(s, Integer.class)
        проще сразу написать
        Integer.valueOf(s)

        Разве что это часть какого-нибудь убер-фреймворка, которые в рантайме решает, во что конвертить...
        Ответить
        • Кстати да... в эту функцию ведь не передашь переменную, в которой лежит неизвестно акой класс, вторым параметром... Система типов не позволит. Или я туплю?
          Ответить
      • ? ты хочешь сказать, что ValueOf не перекрывается, а реализуется непосредственно в каждом классе? Бред же
        Ответить
        • valueOf статический. Как ты его перекроешь? А дженерики - не шаблоны.
          Ответить
          • А че не сделать типы обьектами? Всмысле геттайп выдает обьект класса тайп. Извинясь если нублю
            Ответить
            • если бы у классов был общий предок, у которого есть данный метод, то тогда бы да...
              Ответить
              • Ну я о том и говорю. Класс или интерфейс type с методом ValueOf
                Ответить
                • ну дык нету его... либо вынашивать пилить свою жабу со своими типами и стандартной библиотекой
                  Ответить
          • В шарпе так же оказалось. parse отдельно в каждом классе. Вот тебе и полиморфизм. В шарпеке есть старый добрый
            Convert.ChangeType
            public static T Parse<T>(string value) where T: struct
                    {
                        return (T) Convert.ChangeType(value, typeof (T));
                    }
            Ответить
            • В шарпе специальный интерфейс, который можно реализовать для конвертирования в простые типы. Ну и тогда через System.Convert можно будет преобразовывать. Ну и все примитивные типы его реализуют. Кстати, ещё там есть перегрузки методов для конкретных типов, правда я не понимаю, зачем они там, ибо если тип известен при компиляции, то зачем юзать System.Convert?
              Ответить
              • Ты как то сумбурно написал, я тебя не очень понял) есть класс ValueType - от него наследуются все вэльютайпы (капитан)

                http://msdn.microsoft.com/ru-ru/library/system.valuetype(v=vs.110).aspx

                Есть интерфейс IConvertable
                Ответить
                • Я про IConvertable. Если его реализовать, то можно конвертироваться в базовые типы через http://msdn.microsoft.com/ru-ru/library/system.convert(v=vs.110).aspx
                  Ответить
                  • Ну да. По сути Convert - это такой сахарок Для классов, реализующих IConvertible
                    Ответить
              • можно так
                public static T Parse<T>(string value) where T: struct
                        {
                            return (T)((IConvertible)value).ToType(typeof(T), null);
                        }
                Ответить
      • >T.valueOf(p)
        нет, в жабе генерики не истанцируют класс или метод. И по сути явлются синтаксическим сахаром для кастов
        Ответить
        • PS. Борманд, ты ли это?
          Ответить
          • Если борманд пишет херню - это жена борманда пытается дискредитировать его что бы он вернулся в реальный мир.
            Ответить
          • > Борманд, ты ли это?
            Не знаю.
            Ответить
    • Хуй.
      Ответить
    • ква ква
      какой хороший язык
      Ответить

    Добавить комментарий