如何在存储库模式中修复此通用问题?

时间:2011-09-27 09:44:30

标签: java eclipse generics

我有一个将字符串转换为对象的类型转换器,反之亦然,类型转换器将本地考虑在内。为了容易地实现几种类型的转换器对于BigDecimalPoint等等,我决定将此界面设为通用。

public interface TypeConverter<T extends Object>
{ 
    convertToString(Locale locale, T object);
}

这很好实现,因为你可以确定你只获得所需的T而不必投射或其他东西。

convertToString(Locale locale, BigDecimal bigDecimal) { ... }

要检索正确的转换器,我构建了一个类型转换器存储库,您可以在其中访问特定的类型转换器

 typeConverterRepository.getTypeConverter(sourceValue.getType())

类型转换器存储库比给我们正确的类型转换器。

现在我们要调用这个转换器:

TypeConverter typeConverter = typeConverterRepository.get( ....)
typeConverter.convertToString(context.getLocale(), sourceValue.getValue());

这导致了日食警告:

  

convertToString(Locale, capture#2-of ?)类型中的方法TypeConverter<capture#2-of ?>不适用于参数(Locale, Object)

如何在不使用@SupressWarning注释的情况下修复此问题?谢谢!

1 个答案:

答案 0 :(得分:2)

我认为问题出在你的typeConverterRepository模式中。

做一个类似于以下

的转换器
public class TypeConverterRepository {
    public <T> void registerTypeConverter(Class <T> type, TypeConverter<T> typeConverter);
    public <T> TypeConverter<T> getTypeConverter(Class <T> type);
}

然后你可以做一个

TypeConverter<MyClass> typeConverter = typeConverterRepository.getTypeConverter(MyClass.class);