我可以在Java中为非原始类型编写文字初始化程序吗?

时间:2016-11-08 17:56:57

标签: java literals

Java的文字初始化器主要用于基元(例如int i = 2double j = 4.2),但是某些非基本类也有文字初始化器(例如String a = "Hello"Number z = 43)。我希望实现一个类似于我写的类中的初始化器。我有一个扩展Numeric的课程Number,我希望能够将其初始化为Numeric a = 43。有没有办法可以用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

2 个答案:

答案 0 :(得分:1)

String文字作为Java中的一个特例。 Number没有真正的文字 - 你在这里看到的是一个原始的(如2)被自动装箱到它的包装类(例如Integer)。由于所有数字包装器都扩展Number,因此此分配有效(与Object o = 4;作为法律声明的方式相同)。

但是,您无法在语言中添加自己的文字。你能做的最好的事情就是创建一些静态函数来生成你的类的新实例。

答案 1 :(得分:0)

不,这是不可能的。没有办法初始化除原语之外的值或String之类的值。