Дженерики Java

Не можете ли вы установить цвет возвращаемого компонента TabBarIcon? Взгляните на tintColor в официальных документах: https://reactnavigation.org/docs/en/tab-based-navigation.html

    export default createBottomTabNavigator(
  {
    Home: HomeScreen,
    Settings: SettingsScreen,
  },
  {
    defaultNavigationOptions: ({ navigation }) => ({
      tabBarIcon: ({ focused, horizontal, tintColor }) => {
        return ;
      },
    }),
    tabBarOptions: {
      activeTintColor: 'tomato',
      inactiveTintColor: 'gray',
    },
  }
);

6
задан Michael Myers 11 March 2009 в 18:25
поделиться

5 ответов

Поскольку универсальная информация о типе стирается во времени выполнения, стандартный способ бросить к универсальному типу с a Class объект:

public static <T> T staticCast(Object arg, Class<T> clazz) {
    if (arg == null) return null;
    if (!clazz.isInstance(arg))
        return null;
    T result = clazz.cast(arg);
    return result;
}

Затем назовите его как это:

a = Main.staticCast("B", MyClass.class);
10
ответ дан 8 December 2019 в 05:58
поделиться

Вы имеете в виду как Class<T>.cast(Object obj)?

Что-то как:

Class.forName("YourClass").cast(obj);

Должен сделать в значительной степени, что Вы хотите.

Знайте, что это является довольно вонючим, хотя и, вероятно, знак плохого дизайна.

4
ответ дан 8 December 2019 в 05:58
поделиться

Вы не можете сделать то, что Вы хотите..., по крайней мере, не этот путь. Компилятор удалил всю информацию, таким образом, Вы волнуете с (T), являющимся Объектом в броске - и это работает.

Проблема состоит в том, что позже Вы делаете MyClass = (Строка) объект; и это не позволяется.

Вы обошли проверку компиляторов и заставили ее перестать работать во времени выполнения.

Таким образом, что точно Вы пытаетесь сделать? Если Вы говорите нам, почему Вы хотите сделать это, мы можем, вероятно, сказать Вам Java способ сделать его.

Учитывая Ваш комментарий Вы могли бы попробовать что-то как:

public class Main
{
    public static void main(String[] args)
    {
        String a;
        MyClass b;
        a = staticCast(new String("B"), String.class);
        b = staticCast(new String("B"), MyClass.class);
        System.out.println(a);
    }

    public static class MyClass
    {
    }

    public static <T> T staticCast(Object arg, final Class clazz)
    {
        // edit - oops forgot to deal with null...
        if(arg == null)
        {
            return (null);
        }

        // the call to Class.cast, as mmeyer did, might be better... probably is better... 
        if(arg.getClass() != clazz)
        {
            // Given your answer to Ben S...
            return (null);

            // throw new ClassCastException("cannot cast a " + arg.getClass() + " to a " + clazz);
        }

        return ((T)arg);
    }
}
6
ответ дан 8 December 2019 в 05:58
поделиться

Не принимайте дженерики Java за шаблоны C++. Там будет только одним staticCast методом, которым это называют со стиранием другого типа, не один для каждого T.

Не используя Дженериков вообще, я записал бы этому этот путь:

public static void main(String[] args) {
    MyClass a, b;
    a = (MyClass)Main.staticCast(new String("B"), MyClass.class);
}

public static class MyClass {
}

public static staticCast(Object arg, Class class) {
        if (arg != null && class.isAssignableFrom(arg))
          return arg;
        return null;
}

Или кража из другого ответа, использование дженериков:

public static <T> T staticCast(Object arg, Class<T> class) {
        if (arg != null && class.isAssignableFrom(arg))
        {
           T result = class.cast(arg);
           return result;
        }
        return null;
}
1
ответ дан 8 December 2019 в 05:58
поделиться

Я соглашаюсь с Ben, однако, я предпочитаю следующую нотацию:

MyClass.class.cast(obj);
1
ответ дан 8 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: