[英]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.