2009-06-23 21 views

Respuesta

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

Uso:

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

MyType b = as(MyType.class, ""); 
// b is null 
+0

@erickson: ¡Esto es perfecto! +10 si pudiera (sabía que el genérico se podía usar aquí: P) Agregué un uso de muestra, puede revertir si lo desea. – OscarRyz

+0

+1 para seguridad en tiempo de compilación – dfa

+0

Gracias Oscar, muy agradable! – erickson

27

Puede usar la palabra clave instanceof para determinar si puede lanzar correctamente.

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

Por supuesto que se puede genericied y se convierte en la función, pero creo que la pregunta era acerca de lo que significa Java tiene que lograr esto.

+1

No estoy seguro de que eso es lo que quiere Shoosh. Probablemente se necesita una forma más genérica para tratar el yeso. Esta sería la respuesta perfecta para "Cómo validar mi objeto es una instancia de una clase dada" :) :) – OscarRyz

+0

Necesita una cláusula "else" ... –

+1

Creo que no estamos aquí para resolver problemas para otros, sino que brindamos orientación . Así que señalar la dirección correcta debería ser suficiente. –

0

yo sepa, esto sería (una) de las maneras de hacerlo:

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

feo, pero debe hacer lo que quiera ...

+0

No es un buen caso para usar el método reflectante "cast()". Consulte http://stackoverflow.com/questions/243811/when-should-i-use-the-java-5-method-cast-of-class para obtener más información. – erickson

+0

De acuerdo, tuve un pedo cerebral y me olvidé del operador 'instanceof'. – Peter

+1

creando una excepción en este caso podría evitarse. las excepciones son objetos, por lo que es bueno no crearlos innecesariamente. – cd1

0

En Java, si falla un elenco que se obtener una ClassCastException. Puede capturar la excepción y establecer el objeto de destino en nulo.

-1

puede manejar esta ClassCastException captura

+2

Cada vez que se lanza una excepción, hay una gran cantidad de gastos generales involucrados. Es por eso que las Excepciones deberían ser solo eso, una "excepción". El manejo de excepciones debe reservarse para eventos que son realmente excepcionales. Cuando las excepciones se convierten en la regla, estás programando mal. Es mucho mejor usar la verificación de tipos. – StriplingWarrior

0

Usted puede detectar la excepción:

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

o comprobar el tipo:

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

Los bloques de captura vacíos son un hábito muy malo ... en realidad, creo que el compilador debe darte una bofetada cuando lo hagas;). Y de todos modos, nunca deberías confiar en las excepciones por algo que puedas verificar sin una excepción. –

+2

Por eso también di la versión sin excepción. – Pesto

5

Puede, pero no con una única función en Java:

public B nullCast(Object a) { 

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

EDIT: Tenga en cuenta que no se puede hacer la clase B genérico (para este ejemplo) sin añadir la clase de destino (esto tiene que ver con el hecho de que un tipo genérico no está disponible para instanceof):

public <V, T extends V> T cast(V obj, Class<T> cls) { 
    if (cls.isInstance(obj)) { 
    return cls.cast(obj); 
    } else { 
    return null; 
    } 
} 
+0

Sí, pero estaba dando la idea general, no un método específico. –

+0

C# 's 'as' funciona en objetos nulos, sin embargo. – Nyerguds

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

supongo que esto de alguna manera podría hacerse con los genéricos también pero creo, pero probablemente no es lo que se necesita.

Este método simple recibe Objeto y devuelve el Objeto porque el reparto se realiza en el método cliente.

0

Las dos soluciones anteriores son algo torpe:

Fundición y la captura de ClassCastException: crear el objeto de excepción pueden ser costosos (por ejemplo, el cálculo de la traza de la pila).

El método nullCast descrito anteriormente significa que necesita un método de conversión para cada conversión que desee realizar.

Los genéricos le fallan debido a "tipo borrado" ...

Puede crear un método de ayuda estática que está garantizado para devolver una instancia de su clase o nula objetivo, y luego emitir el resultado sin temor de excepción:

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

llamada de la muestra:

Foo fooInstance = (Foo) nullCast(barInstance, Foo.class); 
Cuestiones relacionadas