Java 定义地图、集合等,然后传递/获取它们

Java 定义地图、集合等,然后传递/获取它们,java,map,pass-by-reference,Java,Map,Pass By Reference,我已经了解到,当您定义{Map,Set,Etc}时,最好使用接口名称: Map<Integer, String> map = new LinkedHashMap<Integer, String>(); 现在我遇到了我的第一个僵局。我不能返回LinkedHashMap,我必须返回Map。 所以在另一节课上,我得到了Map class Foo{ public Foo{ Data data = new Data(); Map<I

我已经了解到,当您定义
{Map,Set,Etc}
时,最好使用
接口
名称:

Map<Integer, String> map = new LinkedHashMap<Integer, String>();
现在我遇到了我的第一个僵局。我不能返回
LinkedHashMap
,我必须返回
Map
。 所以在另一节课上,我得到了
Map

class Foo{

    public Foo{
        Data data = new Data();
        Map<Integer, String> map = data.getMap();
    }

}
class-Foo{
公共食品{
数据=新数据();
Map Map=data.getMap();
}
}
  • 有人能解释一下
    map
    通过时发生了什么吗?
  • 它仍然是一个
    LinkedHashMap

  • 数据是否有任何更改?
  • 如果在调用
    getData()
    之后,我在
    Map
    中放入了一些东西,那么
    Map
    的顺序会发生什么变化?
  • 为什么我不能/不应该在第二个代码段中定义映射?
    我绘制地图的方法是无知的吗?
  • 我应该把
    map
    公开吗

    现在我遇到了我的第一个僵局。我无法返回LinkedHashMap

    这里有一个误解:可以返回一个
    LinkedHashMap
    ,因为
    LinkedHashMap
    是一个
    Map
    ,一种特殊的
    Map
    ,但无论如何都是一个
    Map

    有人能解释一下地图通过后发生了什么吗

    当它被传递时,它被视为任何
    映射
    ,就像incognito一样,但它保持不变

    它还是一张LinkedHashMap吗

    数据是否发生了变化

    没有

    如果在调用getData()之后,我在映射中放入了一些东西,那么映射的顺序会发生什么变化

    这是另一个话题

    为什么我不能/不应该在第二个代码段中定义映射

    您不需要这样做,因为
    LinkedHashMap
    是一个
    Map
    (另一方面,
    Map
    不一定是
    LinkedHashMap

    我画地图的方法是无知的吗? 我应该把地图公之于众吗


    否。

    您可能希望您的变量能够执行它需要执行的操作,并且在执行方式上尽可能灵活。因此,变量的类型应该涵盖所有需要的功能,但在hirachy中应尽可能高

    对象是一种数据结构。那个数据结构不会改变,不管是铸造还是引用分配。我会的。第52项:按对象的名称引用对象interfaces@BoristheSpider谢谢,我将彻底阅读这篇文章。Eclipse对我犹豫不决:“类型不匹配:无法从映射转换到LinkedHashMap”。我可以把它放到LinkedHashMap上。。但这仍然让我摸不着头脑,为什么我会将它定义为
    Map
    ,而不是
    LinkedHashMap
    @模式,这毫无意义。您确定此错误发生在
    getMap()
    中,或者在使用
    getMap()
    的其他一些代码中吗?它在getMap()中。Eclipse在这一行中强调对象
    map
    returnmap并给出该错误
    public LinkedHashMap getMap(){return map;}
    @patterned方法的返回类型和返回值的类型之间存在差异。如果
    map
    的类型为
    LinkedHashMap
    ,则可以将其用作返回类型为
    map
    的方法的返回值。但是,如果
    map
    类型为
    map
    ,则不能将其用于返回类型为
    LinkedHashMap
    @模式的方法。关于接口的全部要点是,在使用实现对象时,不需要知道具体的实现。这就是多态性的意义所在!您的类可以使用它喜欢的任何
    Map
    实现:
    HashMap
    LinkedHashMap
    TreeMap
    ,。。。只需在
    getMap()
    中将其作为
    Map
    返回即可。每当有人调用
    Map
    方法(例如
    getMap().put(5,“foo”)
    )时,它将被分派到实际实现中。认真地
    class Data{
    
        private Map<Integer, String> map;
    
        public Data(){
            map = new LinkedHashMap<Integer, String>();
            //dynamically put some things into the map
        }
    
        public Map<Integer, String> getMap(){
            return map;
        }
    
    }
    
    class Foo{
    
        public Foo{
            Data data = new Data();
            Map<Integer, String> map = data.getMap();
        }
    
    }