【问题标题】:How to create instance of the unkown type?如何创建未知类型的实例?
【发布时间】:2016-07-22 15:22:21
【问题描述】:

我有几个函数需要精确的参数类型(又名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
提前致谢

【问题讨论】:

  • 如果 doWork1 接受对象,则使用对象。您的问题取决于 doWork1 的参数是如何构造的(重载,或者只是一个函数)。
  • @JFMeier 确实如此,因为T 是无限的。
  • 如果需要知道方法中的确切类型,需要将Class&lt;T&gt;作为参数传递给方法。
  • @AndyTurner,好吧,在这种情况下,UnknownType 呢?
  • @StephanLeila 它仍然可以是NumberObject

标签: java


【解决方案1】:

为您的obj 使用类型NumberIntegerDouble 都扩展了这种类型。

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

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

如果你不想这么具体,可以随时使用Object

【讨论】:

  • @StephanLeila 如果您使用第一个示例,您如何知道doWork 中的类型?
【解决方案2】:

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


但是,泛型是不必要的:

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

等同于

private void doWork1(Object _obj) {...}

删除后。

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

  • 您需要指出另一个输入参数的泛型需要相关,例如你正在传递T _objList&lt;T&gt; _list

    请注意,您不需要T _obj1T _obj2 的泛型类型,但它会退化为T 的上限(例如Object);

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

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

你不需要这两种情况,所以只需删除不必要的复杂性。

【讨论】:

  • 感谢您的澄清。是的,Object 可以,非常感谢
猜你喜欢
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多