2014-07-17 9 views
8

Zastanawiałam się, czy istnieje możliwość w Java 8, aby uzyskać referencje Metoda standardowych operatorów (+, -, <,>, ...).Java 8: Get-funkcji operatora obiektu z uwzględnieniem metody

chcę zdobyć jak Foo::+ gdzie Foo jest jakiś określonym miejscu, gdzie mogę go dostać. Ponieważ Java nie zezwala na znaki specjalne w nazwach metod, nie sądzę, że to możliwe, prawda?

Jeżeli powyższy sposób nie istnieje: Czy jest jakieś miejsce, gdzie standardowe operatory są zdefiniowane jak Foo::plus?

Wiem, że istnieje możliwość zdefiniowania go jako lambda ((x, y) -> x + y), ale moim zdaniem może być bardziej wyrazisty w niektórych przypadkach z odwołaniem do metody, jak to jest możliwe w Haskell.

Odpowiedz

7

Uważam, że szukasz int Integer.sum(int, int) i podobnych metod, które są rzeczywiście dostarczane przez API.

Istnieje wiele metod z listy brakuje, ale to typowe dla JDK nie dostarczyć ostatni cal wygody, ponieważ jego rozmiar jest ogromny, nawet bez nich.

Jeśli to jakieś pocieszenie, każdy z moich projektów ma Util klasę gdzie zrzucić ciekawostki takie jak te.

+0

Operatorzy, jak>, <, też? Nie wiem, gdzie szukać. –

+0

Czy jest jakieś miejsce, gdzie można zdefiniować wszystkich operatorów? Niektóre klasy ze statycznymi metodami mogą mieć nazwę "Ops" lub coś w tym stylu? –

+0

Nie, nie sądzę. Ther's "Integer.compare", ale nadal trzeba napisać kod, aby uzyskać predykaty boolowskie. –

0

Standardowe operatory odnoszą się tylko do prymitywów i prymitywów pudełkowych i nie można dynamicznie określić, którzy operatorzy stosują się do danego obiektu.

Edycja: Jeśli chcesz wiedzieć, jaką metodę możesz wywołać w celu wykonania standardowych funkcji operatora, możesz wykonać test instanceof na porównywalny interfejs dla operatorów większych/mniejszych lub równych (http://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html).

+0

"Standardowe operatory odnoszą się tylko do prymitywów i prymitywów pudełkowych i nie można dynamicznie określić, którzy operatorzy stosują się do danego obiektu." Nie rozumiem tego. Myślę, że kompilator może dowiedzieć się, czy typy są odpowiednie. (Cóż, może mój angielski jest po prostu zbyt zły, żeby to zrozumieć ;-)) –

+0

Ok, podczas implementacji '<' Rozumiem, co masz na myśli. Nie można wykonać '<' z nadklasą 'Number'. –

+0

Jedynym operatorem, który działa na obiektach, jest ==. Dzieje się tak dlatego, że faktycznie nie porównuje obiektów, a jedynie referencję (wskaźnik, jeśli znasz C++). Więc jeśli 2 obiekty mają tę samą zawartość, ale nie są to same instancje obiektów, nadal nie będą zwracać wartości true w operatorze ==. – grimmeld

1

Oczyszczoną metodą jest klasa pomocnicza Operators, która zawiera metody dla wszystkich operatorów. Wtedy możesz użyć tych metod jako referencji. Oczywiście, standardowa klasa biblioteki byłaby ładniejsza niż własna klasa pomocnika, ale przynajmniej możesz zdecydować o nazwie tej klasy pomocnika, abyś mógł wybrać imię najbardziej wyraziste dla ciebie.

Powiązane problemy