如何创建未知类型的实例?

时间:2016-07-20 07:38:27

标签: java

我有几个函数需要精确的参数类型(又名T):

private <T> void doWork1(T _obj) {...}
private <T> void doWork2(T _obj) {...}
private <T> void doWork3(T _obj) {...}

我像这样使用它们并且工作正常:

public void parse(int id) {
    switch (id) {
        case 1: {
            Integer obj = new Integer(1);
            doWork1(obj);
            doWork2(obj);
            doWork3(obj);
            break;
        }
        case 2: {
            Double obj = new Double(2);
            doWork1(obj);
            doWork2(obj);
            doWork3(obj);
            break;
        }
        case 3: {
            CustomClass obj = new CustomClass();
            doWork1(obj);
            doWork2(obj);
            doWork3(obj);
            break;
        }
    }
}

但我想知道是否可以使代码更简洁,即

public void parse(int id) {
    UnknownType obj;
    switch (id) {
        case 1: {
            obj = new Integer(1);
            break;
        }
        case 2: {
            obj = new Double(2);
            break;
        }
        case 3: {
            obj = new CustomClass();
            break;
        }
    }
    doWork1(obj);
    doWork2(obj);
    doWork3(obj);
}

如果是这样,我应该放什么而不是UnknownType修改
1)我使用IntegerDouble作为简化示例。在我的实际代码中,我使用自定义类。
2)我需要知道doWork函数中的确切类型(类),因此我无法使用Object
提前致谢

2 个答案:

答案 0 :(得分:4)

使用Number的{​​{1}}类型。 objInteger都扩展了这种类型。

  

抽象类{@code Number}是平台的超类   表示可转换为的数值的类   原始类型{@code byte},{@ code double},{@ code float},{@ code   int},{@ code long}和{@code short}。

Double

如果您不想这样具体,可以随时使用public void parse(int id) { Number obj = null; switch (id) { case 1: { obj = new Integer(1); break; } case 2: { obj = new Double(2); break; } } doWork1(obj); doWork2(obj); doWork3(obj); }

答案 1 :(得分:2)

您可以使用NumberObject,它们都是IntegerDouble的常见超类型。

然而,泛型是不必要的:

private <T> void doWork1(T _obj) {...}

相同
private void doWork1(Object _obj) {...}
擦除后

为输入参数设置类型变量的唯一要点是:

  • 您需要指明其他输入参数的泛型需要相关,例如您正在通过T _objList<T> _list

    请注意,您不需要T _obj1T _obj2的通用类型 - 它会退化为T的上限(例如Object

  • 如果您需要它与返回类型相关:

    <T> T doWork1(T _obj) { ... }
    

你在这里不需要任何一个案例,所以只需删除不必要的并发症。