type specific funcion castear cast java casting

specific - funcion cast en java



Cómo emular C#as-operator en Java (6)

Aquí hay una implementación de as, como sugiere @Omar Kooheji:

public static <T> T as(Class<T> clazz, Object o){ if(clazz.isInstance(o)){ return clazz.cast(o); } return null; } as(A.class, new Object()) --> null as(B.class, new B()) --> B

Hay situaciones en las que es práctico tener un retorno de conversión de tipo un valor nulo en lugar de arrojar una ClassCastException. C # tiene el operador as para hacer esto. ¿Hay algún equivalente disponible en Java para que no tenga que comprobar explícitamente ClassCastException?


Creo que tendrías que hacer tu propio:

return (x instanceof Foo) ? (Foo) x : null;

EDITAR: Si no quiere que su código de cliente trate con valores nulos, entonces puede introducir un Objeto Nulo

interface Foo { public void doBar(); } class NullFoo implements Foo { public void doBar() {} // do nothing } class FooUtils { public static Foo asFoo(Object o) { return (o instanceof Foo) ? (Foo) o : new NullFoo(); } } class Client { public void process() { Object o = ...; Foo foo = FooUtils.asFoo(o); foo.doBar(); // don''t need to check for null in client } }


Puede usar la palabra clave instanceof en lugar de C #, pero no hay nada como as .

Ejemplo:

if(myThing instanceof Foo) { Foo myFoo = (Foo)myThing; //Never throws ClassCastException ... }


Podría escribir un método de utilidad estático como este. No creo que sea terriblemente legible, pero es la mejor aproximación de lo que estás tratando de hacer. Y si usa importaciones estáticas, no sería tan malo en términos de legibilidad.

package com..examples; public class Utils { @SuppressWarnings("unchecked") public static <T> T safeCast(Object obj, Class<T> type) { if (type.isInstance(obj)) { return (T) obj; } return null; } }

Aquí hay un caso de prueba que demuestra cómo funciona (y que funciona).

package com..examples; import static com..examples.Utils.safeCast; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; import org.junit.Test; public class UtilsTest { @Test public void happyPath() { Object x = "abc"; String y = safeCast(x, String.class); assertNotNull(y); } @Test public void castToSubclassShouldFail() { Object x = new Object(); String y = safeCast(x, String.class); assertNull(y); } @Test public void castToUnrelatedTypeShouldFail() { Object x = "abc"; Integer y = safeCast(x, Integer.class); assertNull(y); } }


Estoy especulando que podría crecer y ser un operador

algo como

as<T,Type> (left, right) which evaluates to if (typeof(left) == right) return (right)left else return null

No estoy seguro de cómo lo harías, estoy ac # en este momento y mi sombrero de Java se ha puesto un poco polvoriento desde que dejé la universidad.


En java 8 también puede usar la sintaxis de flujo con Opcional:

Object o = new Integer(1); Optional.ofNullable(o) .filter(Number.class::isInstance) .map(Number.class::cast) .ifPresent(n -> System.out.print("o is a number"));