Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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_Enums - Fatal编程技术网

Java 泛型类枚举返回类型

Java 泛型类枚举返回类型,java,generics,enums,Java,Generics,Enums,我定义了一个转换器接口和两个转换器: public interface StringConverter<T> { T convert(String value); } public class EnumConverter<E extends Enum<E>> implements StringConverter<E>{ private final Class<E> enumClass; public EnumConve

我定义了一个转换器接口和两个转换器:

public interface StringConverter<T> {
  T convert(String value);
}

public class EnumConverter<E extends Enum<E>> implements StringConverter<E>{

  private final Class<E> enumClass;

  public EnumConverter(Class<E> enumClass) {
    this.enumClass = enumClass;
  }

  @Override
  public E convert(String value) {
    return Enum.valueOf(enumClass, value);
  }
}

public class IntegerConverter implements StringConverter<Integer> {

  public Integer convert(String value) {
    return Integer.parseInt(value);
  }

}
公共接口字符串转换器{
T转换(字符串值);
}
公共类EnumConverter实现StringConverter{
私有最终类枚举类;
公共枚举转换器(类枚举类){
this.enumClass=enumClass;
}
@凌驾
公共E转换(字符串值){
返回Enum.valueOf(enumClass,value);
}
}
公共类IntegerConverter实现StringConverter{
公共整数转换(字符串值){
返回整数.parseInt(值);
}
}
我创建了一个返回StringConverter类的工厂接口

public interface StringConverterClassFactory {
  <T> Class<? extends StringConverter<T>> getConverter(Class<T> forType);
}
公共接口StringConverterClassFactory{

Class您可以这样做:

@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> Class<? extends StringConverter<T>> getConverter(Class<T> forType) {
    if (forType.equals(int.class) || forType.equals(Integer.class)) {
        return (Class) IntegerConverter.class;
    } else if (forType.isEnum()) {
        return (Class) EnumConverter.class;
    } else {
        return null;
    }
}
    @Override
    public Class<? extends StringConverter> getConverter(Class forType) {
        if (forType.equals(int.class) || forType.equals(Integer.class)) {
            return IntegerConverter.class;
        } else if (forType.isEnum()) {
            return EnumConverter.class;
        } else {
            return null;
        }
    }
@SuppressWarnings({“unchecked”,“rawtypes”})
公共类和
都是redundent

就这样写吧:

@SuppressWarnings({ "unchecked", "rawtypes" })
public <T> Class<? extends StringConverter<T>> getConverter(Class<T> forType) {
    if (forType.equals(int.class) || forType.equals(Integer.class)) {
        return (Class) IntegerConverter.class;
    } else if (forType.isEnum()) {
        return (Class) EnumConverter.class;
    } else {
        return null;
    }
}
    @Override
    public Class<? extends StringConverter> getConverter(Class forType) {
        if (forType.equals(int.class) || forType.equals(Integer.class)) {
            return IntegerConverter.class;
        } else if (forType.isEnum()) {
            return EnumConverter.class;
        } else {
            return null;
        }
    }
@覆盖
公共类>

证明:
实施另一个目标:

公共类GenericConverter实现StringConverter{
公共E转换(字符串值){return null;}
}

(Class>)和GenericConverter.Class
都不正确


这会导致IntegerConverter和EnumConverter都出现编译错误。@BrandonJohnson编辑您的超级接口
类这是可行的。您能解释一下EnumConverter.class与(类>)不兼容的原因吗,(ClassI在四处寻找类似的东西时发现了这一点:@BrandonJohnson:
EnumConverter。class
具有类型
class
,它不是
class>
的子类型,因为
EnumConverter
不是
StringConverter
的子类型。原因是
EnumConverter
是泛型;使用其原始类型将关闭所有泛型,包括其继承中的泛型。您可以说
EnumConverter
StringConverter
的子类型,或者
EnumConverter
StringConverter
的子类型,但不能说
EnumConverter
StringConverter
的子类型。