当前位置: 首页 > 面试题库 >

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

朱阳曜
2023-03-14
问题内容

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


问题答案:

您可以使用Number或者Object,这是双方共同的超类型IntegerDouble

但是,泛型是不必要的:

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

等同于

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

删除后。

对于输入参数具有类型变量的唯一要点是:

  • 您需要指出另一个输入参数的泛型需要关联,例如,您正在传递T _objList<T> _list

请注意,尽管您并不需要泛型类型,T _obj1并且T _obj2-会退化为T(例如Object)的上限;

  • 如果需要将其与返回类型相关联:
    <T> T doWork1(T _obj) { ... }
    

您在这里不需要任何一种情况,因此只需删除不必要的复杂性即可。



 类似资料:
  • 问题内容: 我有一个我必须验证问题值的对象,这些对象的某些属性是自定义对象的数组。这样一来,这将涉及到数组的各个元素。为每个元素执行吸气剂,例如: 这是我需要达到的。我已使用带有属性列表的枚举以以下方式提取了数据。 致电: 我将使用数组中不同类型和不同值的多个数组。我想创建一个如下的方法。 这给了我多个错误,这些错误主要与repeatingGrp []有关。数组类型应与枚举名称相同。是否可以创建这

  • 问题内容: 如何创建泛型类型的数组?通用方法如何工作?它返回通用数组的副本。因此可以创建通用数组。但是如何?怎么能写一个类似的方法呢? 问题答案: 如果需要在运行时创建它,则至少需要在此时知道类型,因此可以使用以下方法: where 是泛型类型,是的类,并且是初始大小。 这里的文件

  • 问题内容: 在iOS 10 Swift 3中从图像选择器中选择图像时,出现错误- 没有选择和更新图像。我需要帮助或建议,以了解有关此方法的语法或任何内容在iOS10或Swift 3中是否已更改,或者是否有其他方法可以执行。 问题答案: 下面提到的代码确实为我解决了问题-

  • 问题内容: 我尝试运行以下代码。顺便说一句,我是python和sklearn的新手。 其中y是0和1的np.ndarray 我收到以下信息: 文件“ C:\ Anaconda3 \ lib \ site-packages \ sklearn \ linear_model \ logistic.py”,行> 1174,适合check_classification_targets(y) 文件“ C:\

  • 问题内容: 我正在创建一个类及其子类,需要在其中调用父级的静态方法以返回子级实例。 问题答案: 该静态方法被调用,其值是类对象,子类,你把它称为后的构造。因此,您可以使用实例化它:

  • 问题内容: 是否可以在Java中创建泛型类型的实例?我正在根据我所看到的答案进行思考no(由于类型擦除),但是如果有人能看到我所缺少的内容,我将很感兴趣: 编辑:事实证明,超级类型令牌可以用于解决我的问题,但是它需要很多基于反射的代码,如下面的一些答案所示。 问题答案: 你是对的。你做不到。但你可以将其更改为 但这有效。以工厂模式包装它会使它更具容忍性。