11

我需要创建一个扩展 java.util.LinkedHashMap 的自定义类,并将 String 作为键和 String 作为值,并具有一个无参数构造函数,该构造函数使用初始值预填充此映射。

我被困在第一个任务上 - 如何扩展 LinkedHashMap 以使其仅接受通用参数而不是通用参数?

我试过这个,(不工作)

import java.util.LinkedHashMap;

@SuppressWarnings("serial")
public class MyMenu<String, String> extends LinkedHashMap<String, String> {


    public MyMenu(){
        this.put("index.jsp", "Home Page");
    }
}
4

6 回答 6

18

所有你需要的是:

import java.util.LinkedHashMap;

@SuppressWarnings("serial")
public class MyMenu extends LinkedHashMap<String, String> {

    public MyMenu(){
        this.put("index.jsp", "Home Page");
    }
}

从您的班级名称中删除<String, String>,它将起作用。您正在创建一个正在扩展的类,LinkedHashMap<String, String>因此您的类已经是一个Map作为String键和String值的类。如果你想创建自己的泛型类,那么你必须这样做:

为例如创建一个类:

public class MyMenu<K, V> { ... }

然后扩展该类:

public class SomeMyMenu extends MyMenu<String, String> { ... }

在这种情况下,您必须为您的类指定键和值,以便SomeMyMenu类将键和值用作String. 您可以在此处阅读有关泛型的更多信息。

但更有效的方法是创建一些最终类并在其中声明地图,如下所示:

public static final LinkedHashMap<String, String> MAP = new LinkedHashMap<String, String>() {{
    put("index.jsp", "Home Page");
}};

要从您的地图中获取值,请使用:

SomeClass.MAP.get("Some Key");
于 2012-11-05T15:51:23.060 回答
3

如果您的斗争,正如您所描述的,只是与宣言,那么我会尝试类似:

class MyCustomizedMap extends LinkedHashMap<String, String> {
    //...
}
于 2012-11-05T15:46:44.450 回答
2

您可以执行以下操作:

   public class MyMap extends LinkedHashMap<String,String>{
于 2012-11-05T15:48:27.413 回答
1

尝试:

public class MyMap extends LinkedHashMap<String, String> { ... }
于 2012-11-05T15:47:26.130 回答
1

只要你使用的是 JDK 1.5 或更高版本,就可以使用泛型并创建一个 LinkedHashMap 来存储 String 键和 String 值并对其进行初始化,如下所示:

LinkedHashMap<String, String> myMap = new LinkedHashMap<String, String>()
{
    {
        put("abc", "xyz");
        ...
    };
}
于 2012-11-05T15:49:42.583 回答
1

在您的情况下,组合是比继承更好的解决方案:

class MyProperties implements Map<String, String> {

    private Map<String, String> delegatee = new LinkedHashMap<String, String>();

    // ... delegate your methods to delegatee
}
于 2012-11-05T15:53:15.393 回答