Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Overloading / generics in Java

Tags:

java

generics

I want to run certain tests in Lists. The Lists can contain entirely different classes.

I have one method to check the consistency of the list - not null, not empty, no more than x elements. This is common to all the lists. Then I want to test each of the objects, using overloading.

The idea would be something like:

public static <T> void check(List<T> list) {

    //do general checks

    for (T element : list) {
        check(element);
    }
}

and then

public static void check(SomeType element) {...}

public static void check(SomeOtherType element) {...}

But I also had to add a method like this:

public static void check(T element) {...}

And this was called at runtime - not my other methods with the specific classes. Although the class was exactly the same. I'm evidently missing some generics understanding.

Now if I don't use the general method at all and try to solve it this way:

    public static void check(List<SomeType> list) {...}

    public static void check(List<SomeOtherType> list) {...}

Compiler error - "Method check(List) has the same erasure check(List) as another method..."

So is there any elegant solution for this? I could just use different method names but would like to know how it's possible without that.

Thanks!

like image 999
User Avatar asked Jan 30 '13 15:01

User


People also ask

Can generic methods be overloaded?

A generic method can also be overloaded by non-generic methods that have the same method name and number of parameters. When the compiler encounters a method call, it searches for the method declaration that most precisely matches the method name and the argument types specified in the call.

What are generics in Java?

Generics means parameterized types. The idea is to allow type (Integer, String, … etc., and user-defined types) to be a parameter to methods, classes, and interfaces. Using Generics, it is possible to create classes that work with different data types.

Can overloading have different return types?

The compiler does not consider the return type while differentiating the overloaded method. But you cannot declare two methods with the same signature and different return types. It will throw a compile-time error. If both methods have the same parameter types, but different return types, then it is not possible.


1 Answers

This isn't something about generics that you're missing. Java does not have double dispatch. The call to check must be resolved at compile-time, and check(T) is the only match since the compiler can't tell if T is SomeType or SomeOtherType in a given scenario. It needs to choose one method to call that will work for all possible Ts.

This is sometimes solved using the visitor pattern.

like image 134
Mark Peters Avatar answered Oct 08 '22 02:10

Mark Peters