Java Bug(?):参数getName()在传递参数时会发生变化

时间:2013-09-28 04:20:41

标签: java

我正在尝试将范围添加到我的依赖注入包中。所以我想我会定义一个 Scope ,如下所示:

public interface Scope {

    <T> T apply(T type);

    <T> T resolve(Class<T> type);

}

然后创建一个实现该接口的枚举:

public enum Scopes implements Scope {

    DEFAULT,

    SINGLETON {

        private final Map<String, Object> singletons = new HashMap<String, Object>();

        @Override
        public <T> T apply(T object) {
            if (!singletons.containsKey(object.getClass().getName())) {
                singletons.put(object.getClass().getName(), object);
                System.out.println("Applied for: " + object.getClass().getName());
            }
            return object;
        }

        @Override
        @SuppressWarnings("unchecked")
        public <T> T resolve(Class<T> type) {
            Object object = singletons.get(type.getClass().getName());
            System.out.println("Resolved for: " + type.getClass().getName());
            return object == null ? null : (T) object;
        }

    };

    @Override
    public <T> T apply(T object) {
        return object;
    }

    @Override
    public <T> T resolve(Class<T> type) {
        return null;
    }

}

但是,当使用如下代码时:

System.out.println("Real type: " + type.getName());
T result = scope.resolve(type);

由于某些奇怪的原因,解析输出变为 java.lang.Class ,但真实类型输出正确。

1 个答案:

答案 0 :(得分:4)

那不是月亮错误。

  

由于某些奇怪的原因,解析输出变为java.lang.Class,但实际类型输出正确。

Class#getName() java.lang.Classthis Class<Class>,而type的类始终是Class - 因为那就是你已经在方法签名中定义了type的类!

您已经拥有<{em} Class个实例(type,请记住吗?),因此请删除额外的getClass()电话。改变这一行:

System.out.println("Resolved for: " + type.getClass().getName());

到此:

System.out.println("Resolved for: " + type.getName());