2013-07-12 75 views
21

Czy istnieje jakiś sposób użycia autoboxing dla klas, które tworzę? Na przykład mam tę podklasę: Number.Czy tworzenie autoboxing jest możliwe dla klas, które tworzę?

public class UnsignedInteger extends Number { 
    int n; 

    public UnsignedInteger(int n) { 
     if(n >= 0) 
      this.n = n; 
     else 
      throw new IllegalArgumentException("Only positive integers are supported"); 
    } 
} 

Teraz UnsignedInteger i = new UnsignedInteger(88); działa perfekcyjnie, ale czy jest jakiś sposób aby to opracowanie: UnsignedInteger i = 88;? To nie dla mnie. Z góry dziękuję!

+0

Dobra wiadomość na to pytanie. Właśnie wysłałem żądanie funkcji do Oracle w celu dodania obsługi powyższej składni. Miejmy nadzieję, że zostanie zaakceptowana. – Boggartfly

Odpowiedz

16

W skrócie, nie. Nie ma sposobu, aby to skompilować.

Java definiuje tylko ograniczony zestaw wstępnie zdefiniowanych konwersji bokserskich.

Z JLS, section 5.1.7:

Boks konwersji konwertuje przejawy prymitywnego typu do odpowiednich wyrażeń typu odniesienia. W szczególności, następujące dziewięć konwersje są nazywane konwersje bokserskie:

  • Od typu logicznego wpisać Boolean

  • Od typu bajt typu BYTE

  • Od rodzaju krótkiej wpisać krótki

  • Od typu char do typu Character

  • Od typu int do typu INTEGER

  • Od typu long do typu long

  • Od typu float do typu float

  • Od rodzaju podwójnego wpisać podwójne

  • Od zerowej typu do zerowej typu

Dodatkowo, można pomyśl o przeciążeniu operatora = w celu przeprowadzenia tej konwersji, ale przeciążenie operatora nie jest obsługiwane w Javie, w przeciwieństwie do C++, gdzie byłoby to możliwe.

Twoja konwersja nie jest możliwa w Javie.

+0

Moglibyśmy myśleć, że java przeciąża operatora +, *, lub /, - ale to faktycznie działa na zasadzie autoboxingu. Zobacz specyfikację oracle https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html – kelgwiin

1

W skrócie: Nie, to niemożliwe. Aby to zadziałało, potrzebujesz przeciążenia operatora, które nie jest dostępne w Javie. Zobacz link.