44 votes

Existe-t-il une forme de transtypage « type sécurisé » en Java ?

Supposons que j'ai deux classes dérivées d'une troisième classe abstraite :

 public abstract class Parent{
    public Parent(){
    }
}

public class ChildA extends Parent {
    public ChildA {
    }
}

public class ChildB extends Parent {
    public ChildB {
    }
}

En C#, je pouvais gérer le casting d'une manière quelque peu sûre en faisant :

 ChildA child = obj as ChildA;

Ce qui rendrait child == null s'il ne s'agissait pas d'un objet de type ChildA. Si je devais faire :

 ChildA child = (ChildA)obj;

... en C#, cela lèverait une exception si le type n'était pas correct.

Donc, en gros, y a-t-il un moyen de faire le premier type de casting en Java ? Merci.

76voto

Aleks G Points 25412

Je ne peux pas penser à un moyen dans le langage lui-même, mais vous pouvez facilement l'émuler comme ceci :

 ChildA child = (obj instanceof ChildA ? (ChildA)obj : null);

27voto

Dmitry Klochkov Points 1559

Dans Java 8, vous pouvez également utiliser la syntaxe de flux avec Facultatif :

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

20voto

Fabienr_75 Points 509

Vous pouvez utiliser cette méthode qui est compatible avec tous les types java :

 public static <T> T safeCast(Object o, Class<T> clazz) {
    return clazz != null && clazz.isInstance(o) ? clazz.cast(o) : null;
}

Exemple :

 // A given object obj
Integer i = safeCast(obj, Integer.class);

9voto

asenovm Points 3149

Vous pouvez utiliser l'opérateur instanceof

 if(obj instanceof ChildA){
     final ChildA child = (ChildA) obj;
}

2voto

Jonathan Newmuis Points 10958

Vous pouvez toujours vérifier d'abord :

 if (child instanceof ChildA) {
    ChildA child = (ChildA) child;
    // Do stuff.
}

Ou faites simplement une méthode rapide :

 public ChildA getInstance(Parent p) {
    if (child instanceof ChildA) {
        return (ChildA) p;
    } else {
        return null;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X