0

我需要动态绑定一个参数类型(列表),但我不明白......这是我的类的概述:

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 的工厂。我想使用动态绑定为我要放入的每个对象获取正确的 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 的隐式子类型)

任何提示?提前致谢!

4

1 回答 1

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

管他呢。

于 2011-02-02T13:42:08.310 回答