How do I make the method return type generic?

前端 未结 19 2677
無奈伤痛
無奈伤痛 2020-11-22 06:16

Consider this example (typical in OOP books):

I have an Animal class, where each Animal can have many friends.
And subclasses like

19条回答
  •  滥情空心
    2020-11-22 06:26

    I know this is a completely different thing that the one asked. Another way of resolving this would be reflection. I mean, this does not take the benefit from Generics, but it lets you emulate, in some way, the behavior you want to perform (make a dog bark, make a duck quack, etc.) without taking care of type casting:

    import java.lang.reflect.InvocationTargetException;
    import java.util.HashMap;
    import java.util.Map;
    
    abstract class AnimalExample {
        private Map> friends = new HashMap>();
        private Map theFriends = new HashMap();
    
        public void addFriend(String name, Object friend){
            friends.put(name,friend.getClass());
            theFriends.put(name, friend);
        }
    
        public void makeMyFriendSpeak(String name){
            try {
                friends.get(name).getMethod("speak").invoke(theFriends.get(name));
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        } 
    
        public abstract void speak ();
    };
    
    class Dog extends Animal {
        public void speak () {
            System.out.println("woof!");
        }
    }
    
    class Duck extends Animal {
        public void speak () {
            System.out.println("quack!");
        }
    }
    
    class Cat extends Animal {
        public void speak () {
            System.out.println("miauu!");
        }
    }
    
    public class AnimalExample {
    
        public static void main (String [] args) {
    
            Cat felix = new Cat ();
            felix.addFriend("Spike", new Dog());
            felix.addFriend("Donald", new Duck());
            felix.makeMyFriendSpeak("Spike");
            felix.makeMyFriendSpeak("Donald");
    
        }
    
    }
    

提交回复
热议问题