2013-09-28 54 views
0

我试图将范围添加到我的依赖注入包中。所以,我想我会定义一个范围这样的:Java Bug(?):参数getName()在传递参数时发生变化

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由于一些奇怪的原因,但真正的输入正确的输出。

+0

究竟是你的问题? –

+0

为什么解析类型变成了_java.lang.Class_,而不是我传入的内容...... – Jire

回答

4

那不是月亮错误。

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

因为Class#getName()java.lang.ClassthisClass<Class>,类的type总是Class - 因为那是你定义type的类作为方法签名的!

您已经一个Class实例(type,还记得吗?),所以删除多余的getClass()电话。改变这一行:

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

这样:

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