【问题标题】:Passing in "any" class type into a java method将“任何”类类型传递给 java 方法
【发布时间】:2014-07-09 00:58:47
【问题描述】:

好吧,说我有课:

public class ExampleClass() {
    public void exampleClassMethod(ArrayList<CustomClass> abcdefg> arrList) {
        ....
    }
    public void exampleClassMethod2(ArgumentToTakeInAnyCustomClass custClassArg) {
        ....
    }
}

现在我希望能够将任何对象的任何数组列表传递给该类中的该方法。

假设我要传入的自定义类是 CustomClass1、CustomClass2、CustomClass3。

如何设置该方法以接受我传入的任何 ArrayList?另外,假设我只是想自己传递其中一个类,就像在第二个示例方法中一样,我该怎么做?

谢谢。

public void testerMethodInitiater() {
    CustomClass1 abc = new CustomClass1();
    tester((Object) abc);
}
public static void tester(Object abc) {
    //do stuff
    System.out.println(abc);
    if(abc instanceof CustomClass1) {
        System.out.println("This is a CustomClass1");
    }
    (I need to tell the program to create a new CustomClass1 here if it's a CustomClass1) tester;// = new Object<Universalvars.getClassInUse()>;

}  

上面的代码打印出该对象是 CustomClass1 的一个实例,但我不确定此时如何创建一个新的 CustomClass1,除非我做了一个条件语句来命名我正在尝试的所有可能发生的可能性避免。

【问题讨论】:

  • 第二种方法你可以使用接口作为包装器
  • 你为什么不通过Object
  • 我该怎么做呢?谢谢。
  • @alfasin 我认为它可以更笼统。就像传递 List 一样,它是包含 arrayList 或...的超集...
  • 我尝试了对象的事情没有运气

标签: java class methods


【解决方案1】:

任何ArrayList:

public void example( ArrayList<?> arr ) { ...

任何类型的CustomClass

public void example( ArrayList< ? extends CustomClass> arr ) { ...

编辑:对于问题的后半部分,您可以使用反射创建任何类型的新对象:

public void tester( Object obj ) {
  Object obj2 = obj.getClass().newInstance();
}

这要求Object 的类有一个零参数的构造函数。但是,我不知道您为什么要这样做。您可能想改为实现clone(),或者您可能想在这一切结束时多考虑一下您的真正目标。通常向CustomClass 添加多态方法可以解决这些“我有什么类”类型的问题。

【讨论】:

  • 感谢您的及时回答,虽然第二个,它不会是一个数组列表,只是一个传入的类。那将如何工作?
  • 哦,抱歉错过了。任何自定义类都只是public void example( CustomeClass c ) {...
  • 假设我做了任何数组列表之一,我如何查看数组列表的组成?
  • 我知道我是否知道传入的类类型,但可以说我希望能够将三种不同的类型传递给方法。像(CustomClass1 argName),(CustomClass2 argName),(CustomClass3 argName)。有没有办法设置它,还是我必须为每种类型重新制作一个方法?
  • 1.我不确定如何检查参数化类型的类型,我会尝试找到它。 2. 要在 List 中传递任何类型的 CustomClass,请使用我在回答中给出的第二个示例。
【解决方案2】:

使用List&lt;Object&gt; 接受方法中的任何List 对象。

public void exampleClassMethod2(List<Object> custClassArg) {
    ....
}

使用 List 而不是 ArrayList,因为它提供了更大的灵活性。

如果所有其他 customClasses 都从基类型扩展,您也可以使用 List&lt;? extends CustomClass&gt;

【讨论】:

  • 其他类不是从基类扩展的,它们都是自定义对象。
  • 在这种情况下,您只能使用 &lt;Object&gt; 列表,但将其类型转换回原始列表可能会产生开销。您可以传递另一个参数来指定 List&lt;Object&gt; 发送的类型,以便您可以将其类型转换回来并调用类方法。虽然我认为不推荐这种方法。
  • 您是否知道如何处理我手头问题的第二部分?我在问题的底部发布了一些新代码以帮助说明问题。我正在尝试的任何事情似乎都不起作用。
【解决方案3】:

第二部分

1)tester(Object s) 方法将接受所有类型的对象,因为 Java 中的任何对象在内部都继承自 java.lang.Object。所以tester((Object) abc); 根本不需要。

2) 使用 CustomClass1 custom = (CustomClass1)abc 将 abc 类型转换为 CustomClass1。我希望它有效。

3)您可以使用instanceOf 运算符,但我想这对开发人员来说是很多开销,并且会使代码不可读。仅在需要时使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多