我创建了一个通用类型变量的抽象类,其他类型(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>{ ... }
答案 0 :(得分:5)
我怀疑你只需要改变方法的返回类型:
public static Variable<?> createVariable(String type)
基本上说,&#34;我正在返回某种类型的变量,但我没有关于类型参数是什么的信息。&#34;
答案 1 :(得分:0)
作为Jon Skeet答案的替代方案,您可以像这样重写工厂方法:
@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");
请注意,if-elseif-block只是对switch语句的采用。可能有更简洁的方法来实现实际的工厂逻辑,例如通过使用Map<Class<?>, VariableFactory>
,VariableFactory
将成为StringVariableFactory
等具体工厂的接口/超类。