我需要绑定动态参数类型(List),但我没弄错... 这是我班级的概述:
public abstract interface SettingsField<A> extends Window
然后我有一些实现SettingsField的类:
public class StringSettingsField implements SettingsField<String>
public class MapSettingsField<K, V> implements SettingsField<Map<K, V>>
第一个是真的很简单,但是例如第二个有点棘手...所以我想建立一个返回SettingsFileds的工厂。我想使用动态绑定为我想要放入的每个Object获取正确的SettingsWindow。 所以我重载一个方法getField如下。 对于String来说非常简单:
public SettingsField<String> getField(String x){
return new StringSettingsField();
}
但是对于地图我有些麻烦...
public SettingsField<Map<? extends String, ?>> getField(Map<? extends String, ?> x){
return new MapSettingsField();
}
密钥总是一个字符串是一个例子(可能也是?) 但现在编译器给了我那个
的警告MapSettingsField是原始类型。对泛型类型MapSettingsField的引用应该参数化
但我怎么能在这里做到这一点?问题只是使用Map无效,因为java中的f-generic存在一些问题(即使B是A的子类型,List也不是List的隐式子类型)
任何提示?提前谢谢!
答案 0 :(得分:1)
IIUYC,你需要
return new MapSettingsField<? extends String, ?>();
顺便说一句,extends String
没有多大意义,因为String是最终的。
但是,我会选择像
这样的东西public <K, V> SettingsField<Map<K, V>> getField(Map<K, V> x){
return new MapSettingsField<K, V>();
}
你也可以将K声明为有界,例如
public <K extends Number, V extends List> ...
或其他什么。