簡體   English   中英

通用類枚舉返回類型

[英]Generic Class Enum Return type

我已經定義了一個轉換器接口和一對轉換器:

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);
  }

}

我創建了一個返回StringConverter類的工廠接口。

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

我遇到了StringConverterClassFactory實現的問題。

public class DefaultConverterClassFactory implements StringConverterClassFactory {

  @Override
  public <T> Class<? extends StringConverter<T>> getConverter(Class<T> forType) {
    if(forType.equals(int.class) || forType.equals(Integer.class))
      return (Class<? extends StringConverter<T>>)IntegerConverter.class;
    else if(forType.isEnum())
      return (Class<? extends StringConverter<T>>)EnumConverter.class;
    else
      return null;
  }
}

導致兩個轉換器的編譯錯誤,即incompatible types: Class<IntegerConverter> cannot be converted to Class<? extends StringConverter<T>> incompatible types: Class<IntegerConverter> cannot be converted to Class<? extends StringConverter<T>>

使用原始類型我可以擺脫IntegerConverter編譯錯誤,但我仍然得到EnumConverter相同的錯誤。 error: incompatible types: Class<EnumConverter> cannot be converted to Class<? extends StringConverter<?>>

public class DefaultConverterFactory implements StringConverterClassFactory {

  @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 (Class<? extends StringConverter<?>>) EnumConverter.class;
    else
      return null;
  }
}

任何幫助,將不勝感激。

你可以這樣做:

@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;
    }
}

<T><?>都是重要的!

就像這樣寫:

    @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;
        }
    }


編輯:
我之前沒有見過這個問題,所以我真的不知道原因。 這是我的猜測:

  • <T>不是實際類型,因此只要轉換為Class<? extends StringConverter<T>>就會發生錯誤Class<? extends StringConverter<T>> Class<? extends StringConverter<T>> ,類Class<IntegerConverter> cannot be converted to Class<? extends StringConverter<T>> Class<IntegerConverter> cannot be converted to Class<? extends StringConverter<T>>
  • IntegerConverter實現了Type <Integer> ,因此(Class<? extends StringConverter<Integer>>) IntegerConverter.class是正確的,並且(Class<? extends StringConverter<?>>) IntegerConverter.class也可以。
  • EnumConverter使用泛型Type <E extend Enum<E>> ,因此EnumConverter.class無法EnumConverter.class為Type: Class<? extends StringConverter<T>> Class<? extends StringConverter<T>>Class<? extends StringConverter<?>> Class<? extends StringConverter<?>>

    證明:
    制作另一個實施方案:

    public class GenericConverter<E> implements StringConverter<E> { public E convert(String value) { return null; } }

    兩者(Class<? extends StringConverter<T>>) GenericConverter.class(Class<? extends StringConverter<?>>) GenericConverter.class不正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM