En Java, ¿es posible intentar un molde y obtener null
si el molde falla?Equivalente de la palabra clave '#' de C# en Java
Respuesta
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
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.
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
Necesita una cláusula "else" ... –
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. –
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 ...
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
De acuerdo, tuve un pedo cerebral y me olvidé del operador 'instanceof'. – Peter
creando una excepción en este caso podría evitarse. las excepciones son objetos, por lo que es bueno no crearlos innecesariamente. – cd1
En Java, si falla un elenco que se obtener una ClassCastException. Puede capturar la excepción y establecer el objeto de destino en nulo.
puede manejar esta ClassCastException captura
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
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;
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. –
Por eso también di la versión sin excepción. – Pesto
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;
}
}
Sí, pero estaba dando la idea general, no un método específico. –
C# 's 'as' funciona en objetos nulos, sin embargo. – Nyerguds
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.
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);
- 1. C# equivalente de la palabra clave Java 'implements'?
- 2. C++ equivalente de la palabra clave "dinámica" de C# 4.0?
- 3. C++/CLI equivalente de la palabra clave 'readonly' de C#
- 4. ¿Equivalente a la palabra clave "using" de C# en powershell?
- 5. ¿Equivalente de la palabra clave C# `readonly` en D?
- 6. ¿Hay alguna palabra clave en Java que sea similar a la palabra clave 'AS' de C#
- 7. F # equivalente de la C# 'objeto' palabra clave
- 8. ¿Cuál es el equivalente de la palabra clave 'var' de C# en Java?
- 9. En Objective-C, ¿cuál es el equivalente de la palabra clave "instanceof" de Java?
- 10. C# 's palabra clave predeterminada equivalente en C++?
- 11. VB.NET equivalente a la palabra clave var C#
- 12. palabra clave 'fuera' en C++
- 13. ¿Hay un Java equivalente a la palabra clave 'checked' de C#?
- 14. C: Comportamiento de la palabra clave `const`
- 15. ¿Hay un equivalente a la palabra clave "var" de C# en C++/CLI?
- 16. palabra clave foreach en java?
- 17. palabra clave "agradable" en C++?
- 18. Palabra clave VB equivalente para 'break'
- 19. C# ref uso de la palabra clave
- 20. ¿Cuál es el equivalente en F # de la palabra clave predeterminada de C#?
- 21. Palabra clave protegida C#
- 22. palabra clave estática en C#
- 23. Registro palabra clave en C++
- 24. ¿Hay una palabra clave throws en C# como en Java?
- 25. ¿Cómo usar el estilo de Java arroja la palabra clave en C#?
- 26. Palabra clave reservada en la enumeración en C#
- 27. C# palabra clave virtual
- 28. ¿Cuál es el equivalente de VB.NET de la palabra clave predeterminada de C#?
- 29. Java: cuándo utilizar la palabra clave 'this'
- 30. Java - utilizando la palabra clave 'super'
@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
+1 para seguridad en tiempo de compilación – dfa
Gracias Oscar, muy agradable! – erickson