2016-11-08 5 views
1

Javaのリテラルイニシャライザは主にプリミティブ(たとえばint i = 2および)に使用されますが、リテラルイニシャライザ(例:String a = "Hello"またはNumber z = 43)を持つ非プリミティブクラスもあります。私が書いたクラスのそれと同様の初期化子を実装しようとしています。私はNumberを拡張するクラスNumericを持っています。それはNumeric a = 43として初期化できるようにしたいと考えています。これはJavaで行うことができる方法はありますか?あれば、どのようにすればいいですか?ここでプリミティブではないタイプのためにJavaでリテラルイニシャライザを書くことはできますか?

Numeric

public class Numeric extends Number { 

    private HashMap<Primitive, Number> values; 
    private Primitive origin; 

    public Numeric(byte value) { 
     values = new HashMap<>(); 
     values.put(Primitive.BYTE, value); 
     values.put(Primitive.SHORT, (short) value); 
     values.put(Primitive.INT, (int) value); 
     values.put(Primitive.LONG, (long) value); 
     values.put(Primitive.FLOAT, (float) value); 
     values.put(Primitive.DOUBLE, (double) value); 
     origin = Primitive.BYTE; 
    } 

    public Numeric(short value) { 
     values = new HashMap<>(); 
     values.put(Primitive.BYTE, (byte) value); 
     values.put(Primitive.SHORT, value); 
     values.put(Primitive.INT, (int) value); 
     values.put(Primitive.LONG, (long) value); 
     values.put(Primitive.FLOAT, (float) value); 
     values.put(Primitive.DOUBLE, (double) value); 
     origin = Primitive.SHORT; 
    } 

    public Numeric(int value) { 
     values = new HashMap<>(); 
     values.put(Primitive.BYTE, (byte) value); 
     values.put(Primitive.SHORT, (short) value); 
     values.put(Primitive.INT, value); 
     values.put(Primitive.LONG, (long) value); 
     values.put(Primitive.FLOAT, (float) value); 
     values.put(Primitive.DOUBLE, (double) value); 
     origin = Primitive.INT; 
    } 

    public Numeric(long value) { 
     values = new HashMap<>(); 
     values.put(Primitive.BYTE, (byte) value); 
     values.put(Primitive.SHORT, (short) value); 
     values.put(Primitive.INT, (int) value); 
     values.put(Primitive.LONG, value); 
     values.put(Primitive.FLOAT, (float) value); 
     values.put(Primitive.DOUBLE, (double) value); 
     origin = Primitive.LONG; 
    } 

    public Numeric(float value) { 
     values = new HashMap<>(); 
     values.put(Primitive.BYTE, (byte) value); 
     values.put(Primitive.SHORT, (short) value); 
     values.put(Primitive.INT, (int) value); 
     values.put(Primitive.LONG, (long) value); 
     values.put(Primitive.FLOAT, value); 
     values.put(Primitive.DOUBLE, (double) value); 
     origin = Primitive.FLOAT; 
    } 

    public Numeric(double value) { 
     values = new HashMap<>(); 
     values.put(Primitive.BYTE, (byte) value); 
     values.put(Primitive.SHORT, (short) value); 
     values.put(Primitive.INT, (int) value); 
     values.put(Primitive.LONG, (long) value); 
     values.put(Primitive.FLOAT, (float) value); 
     values.put(Primitive.DOUBLE, value); 
     origin = Primitive.DOUBLE; 
    } 

Primitiveのソースコードの一部は、すべてのプリミティブ型を持つだけで、基本的なenumです。

+1

いいえ、できません。 – resueman

答えて

1

StringリテラルはJavaの特殊ケースです。 Numberは本当にリテラルを持っていません - あなたが見ているのは、そのラッパークラス(例えばIntegerなど)にオートボックスされているプリミティブ(2など)です。すべての数値ラッパーはNumberまで拡張されているので、この割り当ては機能します(Object o = 4;は法的な記述と同じです)。

あなた自身のリテラルを言語に追加することはできません。あなたができることは、あなたのクラスの新しいインスタンスを生成するいくつかの静的関数を作成することです。

+0

'Numeric'が' Number'を継承しているので、私は自分の好みでオートボクシングをすることができますか? –

+1

@EliSadoffあなたはまだ運がありません。ラッパークラスはあなたの新しい 'Numeric'クラスの兄弟であるため、プリミティブリテラルは自動的にそれに変換することはできません。 – Mureinik

0

いいえ、これはできません。プリミティブ以外の値を初期化する方法はありません。または、希望通りにStringを初期化する方法はありません。

関連する問題