2014-06-12 50 views
1

我创建了其他类型(boolean,char,int)类扩展的一般类型变量的抽象类。我做了一个静态方法,根据给定的字符串创建这些变量,但我不断收到警告“参考通用类型应参数化”。我知道这是为什么发生,但我不知道如何解决这个问题。任何帮助?使用泛型类型和继承时出现警告

public static Variable createVariable(String variableString) { 
    switch (variableString) { 
     case "int": 
      return new IntVariable(variableName, variableValue); 
     case "double": 
      return new DoubleVariable(variableName, variableValue); 
     case "char": 
      return new CharVariable(variableName, variableValue); 
     case "String": 
      return new StringVariable(variableName, variableValue); 
     case "boolean": 
      return new BooleanVariable(variableName, variableValue); 
     default: 
      throw new VariableException(); 
    } 
} 

public abstract class Variable<T>{ ... } 

public class StringVariable extends Variable<String>{ ... } 

public class DoubleVariable extends Variable<Double>{ ... } 

public class IntVariable extends Variable<Integer>{ ... } 

回答

5

我怀疑你只需要改变方法的返回类型:

public static Variable<?> createVariable(String type) 

,基本上说,“我要回一些类型的变量,但我不知道什么信息类型参数是。“

+0

谢谢!这真的很有帮助。 –

0

作为替代乔恩斯基特的答案,你可以重写你的工厂方法是这样的:

@SuppressWarnings ({ "rawtypes", "unchecked" }) 
public static <T> Variable<T> createVariable(Class<T> varClass, String variableName, String variableValue) { 
    if(varClass.isAssignableFrom(Integer.TYPE)) 
    return (Variable)new IntVariable(); 
    else if (varClass.isAssignableFrom(String.class)) 
    return (Variable)new StringVariable(); 
    ... 
    else 
    throw new VariableException(); 
} 

这不会帮助你摆脱警告(你必须压抑它们),但允许你到不安全的部分封装成生成逻辑和使用的返回值的泛型类型:

Variable<String> v = createVariable(String.class, "name", "value"); 

注意,如果-ELSEIF块只是一个收养你的switch语句。可能有更清晰的方法来实现实际的工厂逻辑,例如通过使用Map<Class<?>, VariableFactory>其中VariableFactory将为像StringVariableFactory等混凝土工厂的接口/超级类。