Эквивалентный из ключевого слова C# 'как' в Java

Функция для скрытия Queboard.

- (void)HideQueyboard
{
    [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder)   to:nil from:nil forEvent:nil];
}
28
задан Pooven 3 May 2012 в 11:54
поделиться

9 ответов

public static <T> T as(Class<T> t, Object o) {
  return t.isInstance(o) ? t.cast(o) : null;
}

Использование:

MyType a = as(MyType.class, new MyType());   
// 'a' is not null

MyType b = as(MyType.class, "");   
// b is null
53
ответ дан 28 November 2019 в 02:26
поделиться

Можно, но не с помощью одной функции в Java:

public B nullCast(Object a) {

  if (a instanceof B) {
     return (B) a;
  } else {
     return null;
  }
}

РЕДАКТИРОВАТЬ: Обратите внимание, что можно 't сделать класс B универсальным (для этого примера) без добавления целевого класса (это связано с тем, что универсальный тип недоступен для instanceof ):

public <V, T extends V> T cast(V obj, Class<T> cls) {
  if (cls.isInstance(obj)) {
    return cls.cast(obj);
  } else {
    return null;
  }
}
5
ответ дан 28 November 2019 в 02:26
поделиться

Вы можете использовать ключевое слово instanceof , чтобы определить, можете ли вы правильно выполнить приведение.

return obj instanceof String?(String)obj: null;

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

29
ответ дан 28 November 2019 в 02:26
поделиться
MyType e = ( MyType ) orNull( object, MyType.class );
// if "object" is not an instanceof MyType, then e will be null.

...

public static Object orNull( Object o , Class type ) { 
    return type.isIntance( o ) ? o : null;
}

Я предполагаю, что это можно было бы как-то сделать и с дженериками, но я думаю, но, вероятно, это не то, что нужно.

Этот простой метод получает Object и возвращает Object, потому что приведение выполняется в клиенте метода.

2
ответ дан 28 November 2019 в 02:26
поделиться

В Java, если преобразование завершилось неудачно, вы получите ClassCastException. Вы можете перехватить исключение и установить для целевого объекта значение null.

0
ответ дан 28 November 2019 в 02:26
поделиться

AFAIK, это был бы (один) из способов сделать это:

SomeClassToCastTo object = null;
try {
  SomeClassToCastTo object = SomeClassToCastTo.class.cast(anotherObject);
}
catch (ClassCastException e) {
  object = null;
}

Уродливо, но он должен делать то, что вы хотите ...

0
ответ дан 28 November 2019 в 02:26
поделиться

Вы можете поймать исключение:

Foo f = null;
try {
  f = Foo(bar);
}
catch (ClassCastException e) {}

или проверить тип:

Foo f = null;
if (bar instanceof Foo)
  f = (Foo)bar;
0
ответ дан 28 November 2019 в 02:26
поделиться

Два приведенных выше решения несколько неудобны:

Приведение и перехват исключения ClassCastException: создание объекта исключения может быть дорогостоящим (например, вычисление трассировки стека).

Метод nullCast, описанный ранее, означает вам нужен метод приведения для каждого приведения, который вы хотите выполнить.

Универсальные шаблоны подводят вас из-за «стирания типа» ...

Вы можете создать статический вспомогательный метод, который гарантированно вернет экземпляр вашего целевого класса или null, а затем преобразовать результат, не опасаясь исключения:

public static Object nullCast(Object source, Class target) {
    if (target.isAssignableFrom(source.getClass())) {
        return target.cast(source);
    } else {
        return null;
    }
}

Пример вызова:

Foo fooInstance = (Foo) nullCast(barInstance, Foo.class);
0
ответ дан 28 November 2019 в 02:26
поделиться

вы можете обработать это исключение ClassCastException

-1
ответ дан 28 November 2019 в 02:26
поделиться