È ansible l’autoboxing per le classi che creo?

C’è un modo per utilizzare la funzione di autoboxing per le classi che creo? Ad esempio, ho questa sottoclass di Number .

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

Now, UnsignedInteger i = new UnsignedInteger(88); funziona perfettamente, ma c’è un modo per farlo compilare: UnsignedInteger i = 88; ? Non farà per me. Grazie in anticipo!

In breve, no. Non c’è modo di farlo compilare.

Java definisce solo un insieme limitato di conversioni di box predefinite.

Da JLS, sezione 5.1.7 :

La conversione di boxing converte le espressioni di tipo primitivo in corrispondenti espressioni di tipo di riferimento. Nello specifico, le seguenti nove conversioni sono chiamate conversioni di boxe:

  • Da tipo booleano a tipo booleano

  • Da tipo byte a tipo byte

  • Da tipo breve a tipo breve

  • Da tipo char per digitare Character

  • Da tipo int a tipo Integer

  • Da tipo long a tipo Long

  • Da tipo float a tipo Float

  • Da tipo double a tipo Double

  • Dal tipo nullo al tipo nullo

Inoltre, si potrebbe pensare di sovraccaricare l’operatore = per eseguire questa conversione, ma l’overloading dell’operatore non è supportato in Java, diversamente dal C ++, dove ciò sarebbe ansible.

Quindi la tua conversione non è ansible in Java.

No Sfortunatamente. Le conversioni di boxe automatiche (come da JLS §5.1.7 ) sono definite solo per le classi wrapper primitive standard.

In breve: no, non è ansible. Perché funzioni, è necessario il sovraccarico dell’operatore, che non è disponibile in Java. Vedi il link .

Se usi Groovy, puoi impostare il comportamento booleano implementando il metodo asBoolean: http://groovy-lang.org/semantics.html#_customizing_the_truth_with_asboolean_methods

Esempio:

 class Color { String name boolean asBoolean(){ name == 'green' ? true : false } } assert new Color(name: 'green') assert !new Color(name: 'red') 

So che questo non è semplice Java, ma compila in bytecode e gira su JVM.