Java 使用泛型类型和继承时出现警告
我创建了一个通用类型变量的抽象类,其他类型的boolean、char、int类可以扩展它。我创建了一个静态方法,该方法根据给定的字符串创建这些变量,但我不断得到警告:泛型类型的引用应该参数化。我知道为什么会这样,但我不知道如何解决这个问题。有什么帮助吗Java 使用泛型类型和继承时出现警告,java,generics,Java,Generics,我创建了一个通用类型变量的抽象类,其他类型的boolean、char、int类可以扩展它。我创建了一个静态方法,该方法根据给定的字符串创建这些变量,但我不断得到警告:泛型类型的引用应该参数化。我知道为什么会这样,但我不知道如何解决这个问题。有什么帮助吗 public static Variable createVariable(String variableString) { switch (variableString) { case "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>{ ... }
我怀疑您只需要更改方法的返回类型:
public static Variable<?> createVariable(String type)
基本上就是说,我返回的是某种类型的变量,但我没有关于类型参数的信息。我怀疑您只需要更改方法的返回类型:
public static Variable<?> createVariable(String type)
基本上就是说,我返回的是某种类型的变量,但我没有关于类型参数是什么的信息。作为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块只是采用了switch语句。可能有更干净的方法来实现实际的工厂逻辑,例如,通过使用Map作为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块只是采用了switch语句。可能有更干净的方法来实现实际的工厂逻辑,例如使用映射