动态绑定与泛型类型

时间:2011-02-02 13:19:03

标签: java generics dynamic-binding

我需要绑定动态参数类型(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的隐式子类型)

任何提示?提前谢谢!

1 个答案:

答案 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> ...

或其他什么。

相关问题