55

ClassCastException をスローする代わりに、型キャストで null 値を返す方が実用的な場合があります。C# には、asこれを行う演算子があります。ClassCastException を明示的にチェックする必要がないように、Java で利用できる同等のものはありますか?

4

6 に答える 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 に答える