Passing in “any” class type into a java method

2020-05-04 23:01发布

问题:

Okay say I have a class:

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

Now I want to be able to pass in any array list of any objects into that method in that class.

Let's say my custom classes to pass in would be CustomClass1, CustomClass2, CustomClass3.

How would I set up that method to accept any ArrayList that I pass in? Also, lets say I just wanted to pass in one of those classes themselves, as in the second example method, how would I do that?

Thanks.

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

}  

Code above prints out that the object is an instance of CustomClass1, but I'm not sure how to make a new CustomClass1 at this time unless I did a conditional statement naming all possibilities that could take place which I'm trying to avoid.

回答1:

Any ArrayList:

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

Any type of CustomClass:

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

Edit: For the second half of your question, you can create a new object of any type with reflection:

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

This requires that the class of Object has a zero-argument constructor. I don't know why you'd want to do this however. You might want to implement clone() instead, or you might want to think a little more about your real goal at the end of all this is. Usually adding a polymorphic method to CustomClass solves these "what class do I have" type questions.



回答2:

Use List<Object> to accept any List object in the method.

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

use List instead of ArrayList as it give more flexibility.

Also you can use List<? extends CustomClass> if all the other customClasses extends from a base type.



回答3:

For the second part

1)tester(Object s) method will accept all Types of Object because any Object in Java internally inherits from java.lang.Object. So tester((Object) abc); not required at all.

2)Typecast abc to CustomClass1 using CustomClass1 custom = (CustomClass1)abc. I hope it works.

3)You can use instanceOf operator but I guess this is lot of overhead for the developer & makes the code unreadable. Use it only if required.