2016-11-08 39 views
1

Java的字面初始值设定项主要用于基元(例如int i = 2double j = 4.2),但也有某些非基本类也具有字面初始值设定项(例如String a = "Hello"Number z = 43)。我正在寻找一个类似于我写的类的初始化器。我有一个类Numeric,延伸Number,我想能够初始化为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 s确实没有文字 - 你在这里看到的是一个原始的(如2)被自动装箱到它的包装类(如Integer)。由于所有的数字包装都是Number,因此这些分配工作(与Object o = 4;将成为法律声明一样)。

尽管如此,您不能将自己的文字添加到该语言中。你可以做的最好的是创建一个静态函数来产生你的类的一个新实例。

+0

由于'数字'扩展'数字'有什么办法我可以在我的青睐与汽车拳击有利我还是我运气不好? –

+1

@EliSadoff你还是不走运。包装类将是您的新'Numeric'类的兄弟,因此原始文字不能自动转换为它。 – Mureinik

0

不,这是不可能的。没有任何办法可以像你想要的那样初始化一个除原语或String以外的值。

相关问题