Подтвердить что ты не робот

Эквивалент ключевого слова С# "как" в Java

В Java можно попытаться выполнить бросок и вернуться null, если сбой выполняется?

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Вы можете, но не с одной функцией в Java:

public B nullCast(Object a) {

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

РЕДАКТИРОВАТЬ: Обратите внимание, что вы не можете создать класс 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;
  }
}

Ответ 4

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;
}

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

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

Foo f = null;
if (bar instanceof Foo)
  f = (Foo)bar;

Ответ 8

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

Литье и улавливание 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);

Ответ 9

вы можете обработать этот catching ClassCastException