如何创建一个包含两个扩展类似父级的子项的地图?

时间:2015-10-26 22:33:20

标签: java generics dictionary

是否可以创建一个有两个孩子的地图(TreeMap)? EX:

我有两个类,A和B,它们都扩展C.我希望将两个A和B添加到SAME地图中。每个类都扩展了C,但我无法弄清楚如何 - 显然如此声明:

Map<String, ? extends C> myMap = new TreeMap<String, ? extends C>();

不起作用。

我需要这个,因为它会使我的程序更容易将这两个对象保存在同一个地图中。从那里我可以简单地检查: if (map.get(key) instanceof A) {do what I want for A objects}

我也不希望将它们转移到C类,因为我们需要A类和B类中的方法,一旦它们“离开”地图。

两个对象执行类似的基本功能,但是具有非常不同的方法和字段,所以我实际上无法解决这个问题而不必“合并”它们,只需添加额外的变量以便稍后检查,即(private static boolean isClassA; ),所以我需要它们成为单独的类,但是在Map中它并不重要,因为它们都扩展了C类并在其中共享一个共同的必需方法。谢谢!

有关该计划的更多信息:

基本上,A类和B类是根据从数据库读入的短语设置的。它们设置类似于: map.put(“这是A类的一个短语”,新类A()); map.put(“B类短语”,新类B());

现在,我正在解析用户的段落输入。我正在比较用户输入的字符串,然后删除与A类或B类共享密钥的任何部分的主要问题。以下是与上述地图值相关的示例:

“这是A类的一个短语,将被删除,B类的短语也将被删除。”基于此输入,当我们循环遍历映射(希望它将包含A类和B类)时,它将从字符串中删除BOTH实例。通过使用方法来剪切字符串(当在地图的键中找到匹配时),返回的字符串将是: “将被取出,这也将被删除”。

现在,这是拥有不同地图的主要问题。我根据键的长度对地图进行排序。因此,首先检查LARGER字符串,并按照从最大字符串到最小字符串的顺序剪切用户句子。

希望你现在看到了这个问题。如果我有两个映射,那么当我检查包含类A的键的用户输入时,它将从A类中的所有最大字符串变为最小字符串。这意味着B类中的任何LARGE字符串(在A类搜索后搜索时)都将被删除。

例如:A班有“我是”和“我感觉很棒”的关键 B级的钥匙“我很开心”和“我觉得。 鉴于用户的句子:“我很开心,感觉很棒。

我们使用第一个包含A类实例的地图进行搜索.A类(通过剪切方法)将从句子中删除“我是”。但这是不正确的,因为B类显然有一个更长的字符串“我很高兴”,它匹配用户句子。如果我们有一个包含B和A和B的地图,那么我们将按照这样的键顺序排列地图:

“我感觉很棒”(A类) “我很开心”(B级) “我觉得”(B级) “我是”(A类)

所以我们会得到CLASS B修剪句子的结果:“并感觉很棒”,因为B级与“我感觉很棒”这个关键词有更大的匹配。

这就是我在同一张地图中需要它们的原因,只是按升序对它们进行排序,并确保它们正确修剪用户字符串。我不能简单地遍历一个地图,然后是另一个地图:/

2 个答案:

答案 0 :(得分:0)

您可以使用Map<String, C> myMap = new TreeMap<String, C>()

它将接受任何扩展C

的类

编辑(对于Luigi的评论):这就是我们继承的原因。你得到之后不需要将结果反馈给A或B,只需使用A和B中不同实现的常用方法,你就不需要任何if (myMap.get(key) insnanceof A) { do blabla}

答案 1 :(得分:0)

我知道您已经说过不能将它们转发到classC,因为您需要一些自定义的classA和classB方法。我可能会误解某些内容,但不能在instanceof之后将它们转换为classA或classB。在那一刻,你已经知道了什么类,因此可以转换为A或B,然后使用自定义方法。

这样的事情(如果我的问题丢失了,请告诉我):

package iseji.app.main;

import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String args[]){
        Map<String, ClassC> myMap = new HashMap<String, ClassC>();
        ClassA classA = new ClassA();
        ClassB classB = new ClassB();

        myMap.put("1", classA);
        myMap.put("2", classB);

        ClassC classC = myMap.get("1");
        if(classC instanceof ClassA){
            System.out.println("Is A");
            classC.printClassName();
            ((ClassA) classC).myClassAMethod();
        }else{
            System.out.println("Is B");
            classC.printClassName();
            ((ClassB) classC).myClassBMethod();
        }

    }
}