Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用泛型类型和继承时出现警告_Java_Generics - Fatal编程技术网

Java 使用泛型类型和继承时出现警告

Java 使用泛型类型和继承时出现警告,java,generics,Java,Generics,我创建了一个通用类型变量的抽象类,其他类型的boolean、char、int类可以扩展它。我创建了一个静态方法,该方法根据给定的字符串创建这些变量,但我不断得到警告:泛型类型的引用应该参数化。我知道为什么会这样,但我不知道如何解决这个问题。有什么帮助吗 public static Variable createVariable(String variableString) { switch (variableString) { case "int":

我创建了一个通用类型变量的抽象类,其他类型的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>{ ... }

我怀疑您只需要更改方法的返回类型:

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语句。可能有更干净的方法来实现实际的工厂逻辑,例如使用映射