微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java泛型传递参数

希望有人可以帮助我摆脱这种困扰.

我做了这个方法

public static <T> void myMethod(Map<Class<T>,MyInterface<T>> map) {
}

使用参数T以确保用作键的类与用作MyInterface中的参数的类相同.

现在我想传递一个不同类作为键的映射,当然还有MyInterface的相应实现.

但它不起作用,因类型参数而导致语法错误.这是代码,我希望是自我解释.

import java.util.HashMap;
    import java.util.Map;

    public class Test {

    public static void main(String[] args) {
        Map<Class<?>,MyInterface<?>> map = new HashMap<Class<?>,MyInterface<?>>();

    //      Map<Class<Object>,MyInterface<Object>> map = new HashMap<Class<Object>,MyInterface<Object>>();

        map.put(Object.class,new MyObjectImpl());

        //if I use Map<Class<Object>,MyInterface<Object>> I get a compiler error here
        //because map<String> is not map<Object> basically
        map.put(String.class,new MyStringImpl());

        //this would be possible using <?>,which is exactly what I don't want
    //      map.put(String.class,new MyIntegerImpl());

        //<?> generates anyways a compiler error
        myMethod(map);
    }

    //use T to make sure the class used as key is the same as the class of the parameter "object" in doSomething  
    public static <T> void myMethod(Map<Class<T>,MyInterface<T>> map) {

    }

    interface MyInterface<T> {
        void doSomething(T object);
    }

    static class MyObjectImpl implements MyInterface<Object> {
        @Override
        public void doSomething(Object object) {
            System.out.println("MyObjectImpl doSomething");
        }
    }

    static class MyStringImpl implements MyInterface<String> {
        @Override
        public void doSomething(String object) {
            System.out.println("MyStringImpl doSomething");
        }
    }

    static class MyIntegerImpl implements MyInterface<Integer> {
        @Override
        public void doSomething(Integer object) {
            System.out.println("MyIntegerImpl doSomething");
        }
    }
}

解决方法

你不能这样做,因为在键和值之间没有Map的put()方法中定义的约束.如果您想确保正确填充地图(即创建此类约束),请隐藏一些将检查正确性的API后面的地图,例如:
public <T> void registerInterface(Class<T> clazz,MyInterface<T> intf) {
    map.put(clazz,intf);
}

然后,只需调用registerInterface而不是手动填充地图.

原文地址:https://www.jb51.cc/java/129434.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐