使用泛型实现java.util.Map

使用泛型实现java.util.Map,java,generics,Java,Generics,我想创建一个java.util.Map的实现,它只接受字符串作为键和值 我试过几种方法 abstract class BaseMap<String,String> implements Map<K,V> 抽象类BaseMap实现映射 这会产生一个编译错误mebe,因为我正在实现接口,而没有实现键和值的完整定义 然后我尝试扩展接口来定义类型,但它不允许我这样做 public interface IBaseMap<String, String> extends

我想创建一个java.util.Map的实现,它只接受字符串作为键和值

我试过几种方法

abstract class BaseMap<String,String> implements Map<K,V>
抽象类BaseMap实现映射
这会产生一个编译错误mebe,因为我正在实现接口,而没有实现键和值的完整定义

然后我尝试扩展接口来定义类型,但它不允许我这样做

public interface IBaseMap<String, String> extends Map<K, V>
公共接口IBaseMap扩展映射
它仍然给出错误“类型参数字符串正在隐藏java.lang.String”


请帮助,提前感谢

您需要提供具体类型,同时扩展泛型接口,如:

abstract class StringToStringMap implements Map<String, String> {
   // ...
}
抽象类StringToStringMap实现映射{
// ...
}
或者,如果要扩展
Map
界面,则:

interface IBaseMap extends Map<String, String> {
   // ...       
}
接口IBaseMap扩展映射{
// ...       
}

您需要提供具体类型,同时扩展泛型接口,如:

abstract class StringToStringMap implements Map<String, String> {
   // ...
}
抽象类StringToStringMap实现映射{
// ...
}
或者,如果要扩展
Map
界面,则:

interface IBaseMap extends Map<String, String> {
   // ...       
}
接口IBaseMap扩展映射{
// ...       
}

您真的需要继承吗?你真的应该避免这样使用它。您可以以更好的方式使用合成:

class CustomMap<K extends String, V extends String> {
    private Map<K, V> map;

    public Map<K, V> getMap() {
        return map;
    }
}

你真的需要继承吗?你真的应该避免这样使用它。您可以以更好的方式使用合成:

class CustomMap<K extends String, V extends String> {
    private Map<K, V> map;

    public Map<K, V> getMap() {
        return map;
    }
}

implements Map
抽象类BaseMap implements Map这也给出了一个错误。现在,如果我从类名中删除泛型,它会工作,但是我不会从泛型中取消类型强制吗?有效的是
BaseMap implements Map
BaseMap implements Map
…否,因为强制来自您正在实现的指定类型。您正在将
Map
的实现固定到
String
,因此您的
BaseMap
无法克服这一点(因此也固定到
String
),请随意接受其他答案之一。他们可能是在跟踪我,但他们更准确,更具解释性。我推荐anubhava的答案,因为他最准确地回答了您的问题(imho)。
implements Map
abstract class BaseMap implements Map这也给出了一个错误。现在,如果我从类名中删除泛型,它会工作,但是我不会从泛型中取消类型强制吗?有效的是
BaseMap implements Map
BaseMap implements Map
…否,因为强制来自您正在实现的指定类型。您正在将
Map
的实现固定到
String
,因此您的
BaseMap
无法克服这一点(因此也固定到
String
),请随意接受其他答案之一。他们可能是在跟踪我,但他们更准确,更具解释性。我建议阿努巴瓦回答这个问题,因为他最准确地回答了你的问题(imho)。因为
String
final
,所以不需要
K extends String
,等等@TedHopp。是 啊但这是为类型参数指定边界所必需的。我认为根本不需要类型参数。只需声明
私有映射
公共映射getMap()@TedHopp。我想这对于强制执行
Map
@TedHopp的类型参数是必要的。哎呀。完全忽略了这一点。因为
String
final
,所以不需要
K扩展String
,等等@TedHopp。是 啊但这是为类型参数指定边界所必需的。我认为根本不需要类型参数。只需声明
私有映射
公共映射getMap()@TedHopp。我想这对于强制执行
Map
@TedHopp的类型参数是必要的。哎呀。完全错过了。