Czy w Javie można wykonać rzutowanie i odzyskać null
, jeśli rzutowanie się nie powiedzie?Równoważnik słowa kluczowego C# "as" w języku Java
Odpowiedz
public static <T> T as(Class<T> t, Object o) {
return t.isInstance(o) ? t.cast(o) : null;
}
Zastosowanie:
MyType a = as(MyType.class, new MyType());
// 'a' is not null
MyType b = as(MyType.class, "");
// b is null
Można użyć słowa kluczowego instanceof
, aby określić, czy można poprawnie rzutować.
return obj instanceof String?(String)obj: null;
Oczywiście może być generowany i wprowadzany do funkcji, ale myślę, że pytanie dotyczyło tego, co oznacza, że Java musi to osiągnąć.
Nie jestem pewien, czy tego chce Shoosh. Prawdopodobnie potrzebny jest bardziej ogólny sposób traktowania obsady. Byłaby to idealna odpowiedź dla "Jak zweryfikowałem mój obiekt jest instancją danej klasy" :) :) – OscarRyz
Potrzebuję "innej" klauzuli ... –
Myślę, że nie jesteśmy tutaj, aby rozwiązywać problemy dla innych, ale dostarczać wskazówek . Wskazanie właściwego kierunku powinno wystarczyć. –
AFAIK, byłoby to (jeden) ze sposobów, aby to zrobić:
SomeClassToCastTo object = null;
try {
SomeClassToCastTo object = SomeClassToCastTo.class.cast(anotherObject);
}
catch (ClassCastException e) {
object = null;
}
brzydki, ale powinien robić to, co chcesz ...
To nie jest dobry przypadek użycia refleksyjnej metody "cast()". Zobacz http://stackoverflow.com/questions/243811/when-should-i-use-the-java-5-method-cast-of-class, aby uzyskać więcej informacji. – erickson
Zgadzam się, miałem bart mózgowy i zapomniałem o operatorze 'instanceof'. – Peter
tworzenie wyjątku w tym przypadku można byłoby uniknąć. wyjątki są obiektami, więc dobrze jest nie tworzyć ich niepotrzebnie. – cd1
W Javie jeśli obsada nie będziesz uzyskać wyjątek ClassCastException. Możesz przechwycić wyjątek i ustawić obiekt docelowy na wartość null.
można obsługiwać ten połowu ClassCastException
Za każdym razem, gdy wyjątek zostanie rzucony, wiąże się to z dużym obciążeniem. Właśnie dlatego Wyjątki powinny być właśnie tym - "wyjątkiem". Obsługa wyjątków powinna być zarezerwowana dla wydarzeń naprawdę wyjątkowych. Gdy wyjątki stają się regułą, programujesz źle. O wiele lepiej jest używać sprawdzania typu. – StriplingWarrior
Można też złapać wyjątek:
Foo f = null;
try {
f = Foo(bar);
}
catch (ClassCastException e) {}
lub sprawdzić typ:
Foo f = null;
if (bar instanceof Foo)
f = (Foo)bar;
Puste bloki blokujące są bardzo złym nawykiem ... faktycznie, myślę, że kompilator powinien uderzyć Cię w twarz, kiedy to zrobisz;). W każdym razie, nigdy nie powinieneś polegać na wyjątkach dla czegoś, co możesz sprawdzić bez wyrzucania wyjątku. –
Dlatego właśnie podałem wersję bez wyjątku. – Pesto
Można, ale nie z jednej funkcji w Java:
public B nullCast(Object a) {
if (a instanceof B) {
return (B) a;
} else {
return null;
}
}
EDIT: Należy pamiętać, że nie można dokonać klasa B generic (dla tego przykładu) bez dodawania klasę docelową (ma to związek z faktem, że typ rodzajowy nie jest dostępny do instanceof
):
public <V, T extends V> T cast(V obj, Class<T> cls) {
if (cls.isInstance(obj)) {
return cls.cast(obj);
} else {
return null;
}
}
Tak, ale podawałem ogólny pomysł, a nie konkretną metodę. –
C# 's 'as' działa na obiektach pustych. – 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;
}
myślę, może to jakoś zrobić z rodzajowych również, ale myślę, ale prawdopodobnie nie jest to, co jest potrzebne.
Ta prosta metoda otrzymuje obiekt i zwraca obiekt, ponieważ rzutowanie odbywa się w kliencie metody.
Oba roztwory powyżej są nieco niewygodne:
odlewnicze i uchwyt ClassCastException: tworzenie obiektu wyjątku może być kosztowne (na przykład obliczenia śledzenia stosu).
Opisana wcześniej metoda nullCast oznacza, że do każdej obsady, którą chcesz wykonać, potrzebujesz metody rzutowania.
Generics zawodzi z powodu "usunięcia typu" ...
Można utworzyć statyczną metodę pomocnika, który jest gwarantowany powrót instancją klasy docelowej lub null, a następnie rzucić wynik bez obawy wyjątek:
public static Object nullCast(Object source, Class target) {
if (target.isAssignableFrom(source.getClass())) {
return target.cast(source);
} else {
return null;
}
}
wezwanie Próbka:
Foo fooInstance = (Foo) nullCast(barInstance, Foo.class);
- 1. Równoważnik słowa kluczowego Super w C#
- 2. Użycie słowa kluczowego "this" w języku Java
- 3. Java - użycie słowa kluczowego "super"
- 4. Zasady korzystania z słowa kluczowego restrict w języku C?
- 5. Jaki jest pożytek ze słowa kluczowego `default` w języku C#?
- 6. Dlaczego warto używać słowa kluczowego globalnego w języku C#?
- 7. F # odpowiednik słowa kluczowego `is` w języku C#?
- 8. Dlaczego używamy zmiennego słowa kluczowego w C++?
- 9. Alternatywy dla słowa kluczowego "using" w C#?
- 10. Równoważnik obiecywania w języku C#
- 11. Odpowiednik C++/CLI słowa kluczowego C# 'readonly'
- 12. Optymalizacje dla końcowego słowa kluczowego
- 13. C# Równoważnik Java IdentityHashMap
- 14. Czy istnieje odpowiednik słowa kluczowego C# "var" w C++/CLI?
- 15. Co to jest odpowiednik słowa kluczowego C# 'var w języku Java?
- 16. Równoważnik zestawu drzewiastego w języku Java do języka C# .net
- 17. Pełny przykład użycia lotnego słowa kluczowego w java?
- 18. rozciąga słowa kluczowego w rodzaju powrotnego w podpis metody Java
- 19. C# Wzory użycia słowa kluczowego "is"
- 20. Cuda słowa kluczowego yield
- 21. Czy istnieje odpowiednik dla słowa kluczowego zarezerwowanego dla języka C# w języku C#?
- 22. Co to jest odpowiednik VB.NET słowa kluczowego C# readonly?
- 23. Co to jest odpowiednik VB.NET słowa kluczowego C# "is"?
- 24. Możliwy błąd w obsłudze słowa kluczowego `default` w VS2015 C++
- 25. Równoważnik C# ObservableCollection w Javie
- 26. Kiedy używać NOWEGO słowa kluczowego w języku C# podczas tworzenia obiektu w ASP.NET MVC 5
- 27. Dlaczego IntPtr nie potrzebuje niebezpiecznego słowa kluczowego?
- 28. Z WYJĄKTU słowa kluczowego w Oracle
- 29. Cel słowa kluczowego "instancetype" w metodach "objectWith"?
- 30. błąd używając ograniczać słowa kluczowego
@erickson: To jest idealne! +10 gdybym mógł (wiedziałem, że generyczny mógłby być tutaj użyty: P) Dodałem przykładowe użycie, jeśli chcesz, możesz wycofać. – OscarRyz
+1 za bezpieczeństwo podczas kompilacji – dfa
Dzięki Oscar, bardzo ładnie! – erickson