2012-08-13 134 views
0

我有以下类别:推断泛型类在Java中

public abstract class ClassWithHelper<T extends HelperInterface> { 
    Class<T> helperClass; 
    protected T helper; 
     protected Gson gson = new GsonBuilder().create(); 

     public void loadHelper(String helperString) throws InstantiationException,  IllegalAccessException { 
     if (!Strings.isNullOrEmpty(helperString)) { 
      wizard = gson.fromJson(helperString, getHelperClass()); 
     } else { 
      wizard = getHelperClass().newInstance(); 
     } 
    } 

    protected abstract Class<T> getHelperClass(); 
} 

public class ImplementingClass extends ClassWithHelper<HelperClass> { 

    @Override 
    protected Class<HelperClass> getHelperClass() { 
     return HelperClass.class; 
    } 
}  

现在,什么是好的是,当我打电话implementingClass.helperClass,它会自动它转换到助手类。但是,我想知道如果我真的需要编写并重写getHelperClass。我无法编写helper.getClass(因为它可能为空),并且我知道写入的方式存在类型擦除问题。

但是,有没有办法让我重写我的代码,以避免必须以两种方式声明helperClass,并仍然有类型推断?

+2

你介意编辑后有很好的格式化的代码? – Thomas 2012-08-13 15:14:41

+0

是的,更好的格式化会有所帮助。此外,代码中似乎没有一些东西。 T是ClassWithHelper类的类型参数吗? ImplementingClass是否为T提供了一个类型参数? – 2012-08-13 15:22:35

回答

3

试试这个:

protected Class<T> getHelperClass() { 
    final ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass(); 
    return (Class<T>) parameterizedType.getActualTypeArguments()[0]; 
} 
+0

工作。精彩的代码。我得晚点解决吧! – Joe 2012-08-13 17:43:43

1

据我所知,除非你能在helper反映,很不幸没有可用运行时类型信息 - 仿制药严格编译时工具。

有不同的方式,你可以做到这一点 - 包括类型作为参数来ClassWithHelper的构造函数,而不是压倒一切的方法,或力亚型提供helperFromJSONnewHelper方法 - 如果你认为更好看,但如果你需要的在运行时键入,你需要“用两种方式说明”。

1

如何:

public abstract class ClassWithHelper<T extends HelperInterface> { 
    Class<T> helperClass; 
    protected T helper; 
    protected Gson gson = new GsonBuilder().create(); 

    public void loadHelper(String helperString) throws InstantiationException,  IllegalAccessException { 
     if (!Strings.isNullOrEmpty(helperString)) { 
      wizard = gson.fromJson(helperString, getHelperClass()); 
     } else { 
      wizard = getHelperClass().newInstance(); 
     } 
    } 

    public Class<T> getHelperClass() { 
     return helperClass; 
    } 

    protected ClassWithHelper(Class<T> helperClass) { 
     this.helperClass = helperClass; 
    } 

} 

public class ImplementingClass extends ClassWithHelper<HelperClass> { 

    public ImplementingClass() { 
     super(HelperClass.class); 
    } 

} 
+0

这可能和它一样好。在你的写作方式中,你仍然需要两次写HelperClass。 – Joe 2012-08-13 17:36:44