ClassCastException をスローする代わりに、型キャストで null 値を返す方が実用的な場合があります。C# には、asこれを行う演算子があります。ClassCastException を明示的にチェックする必要がないように、Java で利用できる同等のものはありますか?
26133 次
6 に答える
61
@Omar Kooheji によって提案された as の実装は次のとおりです。
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
于 2008-09-29T14:36:16.167 に答える
27
自分でロールバックする必要があると思います:
return (x instanceof Foo) ? (Foo) x : null;
編集: クライアント コードで null を処理したくない場合は、Null オブジェクトを導入できます。
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
}
}
于 2008-09-29T14:15:04.657 に答える
15
instanceofC# の の代わりにキーワードを使用できますが、のisようなものはありませんas。
例:
if(myThing instanceof Foo) {
Foo myFoo = (Foo)myThing; //Never throws ClassCastException
...
}
于 2008-09-29T14:14:14.333 に答える
12
このような静的ユーティリティ メソッドを記述できます。私はそれがひどく読みやすいとは思いませんが、あなたがやろうとしていることの最良の近似です. また、静的インポートを使用すると、読みやすさの点でそれほど悪くはありません。
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);
}
}
于 2008-09-29T14:33:19.247 に答える
-3
おそらく as 演算子を作成できると推測しています
何かのようなもの
as<T,Type> (left, right)
which evaluates to
if (typeof(left) == right)
return (right)left
else
return null
あなたならどうするかわかりませんが、私は現在 ac# で、大学を卒業してから Java の帽子が少し汚れてきました。
于 2008-09-29T14:16:45.730 に答える