0 votes
1 view
in Java by (10.2k points)

Consider this example (typical in OOP books):

I have an Animal class, where each Animal can have many friends.
And subclasses like Dog, Duck, Mouse etc which add specific behavior like bark(), quack() etc.

Here's the Animal class:

public class Animal {
    private Map<String,Animal> friends = new HashMap<>();

    public void addFriend(String name, Animal animal){
        friends.put(name,animal);
    }

    public Animal callFriend(String name){
        return friends.get(name);
    }
}

And here's some code snippet with lots of typecasting:

Mouse jerry = new Mouse();
jerry.addFriend("spike", new Dog());
jerry.addFriend("quacker", new Duck());

((Dog) jerry.callFriend("spike")).bark();
((Duck) jerry.callFriend("quacker")).quack();

Is there any way I can use generics for the return type to get rid of the typecasting, so that I can say

jerry.callFriend("spike").bark();
jerry.callFriend("quacker").quack();

Here's some initial code with return type conveyed to the method as a parameter that's never used.

public<T extends Animal> T callFriend(String name, T unusedTypeObj){
    return (T)friends.get(name);        
}

Is there a way to figure out the return type at runtime without the extra parameter using instanceof? Or at least by passing a class of the type instead of a dummy instance.
I understand generics are for compile time type-checking, but is there a workaround for this?

1 Answer

0 votes
by (46.1k points)

No, the compiler can't understand what sort jerry.callFriend("spike") would execute. 

You could set callFriend this method:

public <T extends Animal> T callFriend(String name, Class<T> type) {

    return type.cast(friends.get(name));

}

Then call it as such:

jerry.callFriend("spike", Dog.class).bark();

jerry.callFriend("quacker", Duck.class).quack();

This syntax has the advantage of not producing any compiler warnings. This is just an updated version of calling from the pre-generic days and doesn't attach any additional safety.

Related questions

0 votes
1 answer
0 votes
1 answer
asked Jul 17, 2019 in Java by Anvi (10.2k points)
0 votes
1 answer
0 votes
1 answer
Welcome to Intellipaat Community. Get your technical queries answered by top developers !


Categories

...