在某些情況下,類型轉換返回空值而非拋出ClassCastException是可行的。 C#有as
運算符來執行此操作。在Java中是否有可用的等價物,所以您不必顯式檢查ClassCastException?如何在Java中模擬C#as-operator
回答
這裏的,由@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
您可以使用instanceof
關鍵字代替C#的is
,但沒有什麼像as
。
例子:
if(myThing instanceof Foo) {
Foo myFoo = (Foo)myThing; //Never throws ClassCastException
...
}
我倒是覺得你必須推出自己的:
return (x instanceof Foo) ? (Foo) x : null;
編輯:如果你不想讓你的客戶端代碼來處理空值,然後你可以引入一個Null Object
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
}
}
我猜測,你可以propably CREAS一個作爲運營商
像
as<T,Type> (left, right)
which evaluates to
if (typeof(left) == right)
return (right)left
else
return null
我不知道你是怎麼做到的,我是一個C#的時刻,因爲我離開了我大學的Java帽子已經變得有點髒。
具體類型比較,即`typeof(left)== right`不是`as`所做的。 – weston 2013-09-06 08:31:02
你可以編寫一個像這樣的靜態工具方法。我不認爲這是非常可讀的,但它是你想要做的最好的近似。如果你使用靜態導入,它的可讀性不會太差。
package com.stackoverflow.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;
}
}
以下是一個演示它是如何工作的測試案例(以及它的工作。)
package com.stackoverflow.examples;
import static com.stackoverflow.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);
}
}
這實際上不起作用。 isAssignableFrom測試以查看obj是否是T超類的實例。因此,safeCast(new Object(),A.class).doA()將返回類轉換異常,而不是NPE。 – 2008-09-29 14:43:40
在java 8中,您還可以使用可選的流語法:
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"));
- 1. 如何在C#中模擬C++聯合?
- 2. 在C++中模擬Java導入
- 3. 在C++中模擬Java的線程類
- 4. 如何在Java Spring中模擬RestTemplate?
- 5. 如何在java中模擬YearMonth 8
- 6. 如何在C#流中模擬Java Scanner的next()方法?
- 7. 如何在c中模擬XHttpRequest#
- 8. 如何在C中模擬按鍵#
- 9. 如何在C#中模擬類成員?
- 10. 如何在C中模擬按鍵#
- 11. 如何在Ruby中模擬Ctrl + C?
- 12. java模擬到C#APM/IHttpAsyncHandler
- 13. java:如何模擬Calendar.getInstance()?
- 14. 在Java中模擬Oracle SPOOL
- 15. 模擬HTTPS在Java
- 16. 的Java:在模擬
- 17. 在Python中模擬C宏
- 18. 在C#中cURL模擬?
- 19. 在C#中模擬IDispatchEx#
- 20. 在C中模擬ImageLayout.Zoom#
- 21. 如何模擬多重繼承在C#
- 22. 如何在純java的gradle模塊中模擬Android的productFlavors?
- 23. 如何模擬C++中的接口?
- 24. 如何模擬C#中的擊鍵?
- 25. 如何模擬在iPhone模擬器
- 26. 如何在C#和VB.NET中模擬C++的朋友?
- 27. 如何模擬C#中的事件數組? (如在VB6中)
- 28. 如何在ASP.NET MVC中模擬模型?
- 29. 如何在unittest中模擬python模塊
- 30. java模擬
是的,老雙演員。恥辱Java沒有像'as'那樣優雅的東西。 – 2008-09-29 14:14:59
'as'是一個非常有用的東西。 – 2008-09-29 14:16:03