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"));