【问题标题】:Access object variables in java在java中访问对象变量
【发布时间】:2014-04-29 19:53:32
【问题描述】:

如果我有

public class fakeclass{
int a;
int b; 
//getters and setters etc.
}

fakeclass abc = new fakeclass();
Map<String,List<Object>> tempObject= new HashMap<String,List<Object>>();
tempobject.put("blabla",abc); 

假设tempObject 中的所有值都是实例类型fakeclass,我如何访问类的getter 和setter?如果我进行迭代,它是“对象”类型,不会显示 getter 和 setter。 (除非我将地图类型更改为 fakeclass)。

只是对执行此操作的选项感兴趣。

【问题讨论】:

  • 您可以将对象投射到您的 fakeClass;我不知道查询地图的确切方法名称,但对于您会执行的列表:int fakeA = ((fakeClass) list.get(0)).getA();
  • "假设 tempObject 中的所有值都是实例类型 fakeclass" 假设您应该使用 Map&lt;String,List&lt;fakeclass&gt;&gt;...跨度>

标签: java object arraylist map


【解决方案1】:

投射它:

((fakeclass)tempobject.get("blablabla").get(0)).getxxx()

注意get(0),因为Map 属于Lists

【讨论】:

    【解决方案2】:

    如果确定列表中的值来自 fakeclass 为什么不呢

    Map<String,List<fakeclass>> tempObject= new HashMap<String,List<fakeclass>>();
    

    【讨论】:

      【解决方案3】:

      根据您调用Mapput 方法的方式,我认为您真正想要的是Map&lt;String, Fakeclass&gt;,而不是Map 内部的List

      public class Fakeclass{
          int a;
          int b; 
          //getters and setters etc.
      }
      
      Fakeclass abc = new Fakeclass();
      Map<String, Fakeclass> tempObject= new HashMap<String, Fakeclass>();
      tempObject.put("blabla", abc); 
      

      然后你就可以访问Fakeclass的setter/getter了

      tempObject.get("blabla").getA();
      

      【讨论】:

        【解决方案4】:

        以下这些行将无法编译。

        fakeclass abc = new fakeclass();
        Map<String,List<Object>> tempObject= new HashMap<String,List<Object>>();
        tempobject.put("blabla",abc); 
        

        你有兴趣存储 List 或 fakeclass 吗?

        如果以下陈述为真

        Making the assumption that all values inside the tempObject are of instance type fakeclass
        

        你应该这样使用

                   fakeclass abc = new fakeclass();
                Map<String,fakeclass> tempObject= new HashMap<String,fakeclass>();
                tempObject.put("blabla",abc);
                tempObject.get("blabla").getA();
        

        如果您的意图是为字符串存储 FakeClass 列表,请使用以下内容

        fakeclass abc = new fakeclass();
                Map<String,List<fakeclass>> tempObject= new HashMap<String,List<fakeclass>>();
                List<fakeclass> list = tempObject.get("blabla");
                if (list == null){
                    list = new ArrayList<fakeclass>();
                }
                list.add(abc);
                tempObject.put("blabla",list);
        

        如果您希望访问列表中第一个元素的 getters 方法,请使用此

        tempObject.get("blabla").get(0).getA();
        

        【讨论】:

          【解决方案5】:
          fakeclass abc = new fakeclass();
          Map<String,List<fakeclass>> tempObject= new HashMap<String,List<fakeclass>>();
          //don;t forget the List
          List<fakeclass> list = new ArrayList<>();
          list.add(abc);
          tempobject.put("blabla",list); 
          

          现在,当您从地图和该列表中的任何对象访问列表时,您可以将其用作类型“fakeclass”。

          fakeclass retrieved = tempobject.get("blabla").get(0);
          //use retreived as a fakeclass with all its setters and getter.
          

          但如果你必须保留 Object 类型的列表,那么你总是可以直接转换它。

          Object retrieved = tempobject.get("blabla").get(0);
          fakeclass retreivedFakeclass = (fakeclass) retrieved ;
          //use retreivedFakeclass as a fakeclass with all its setters and getters.
          

          【讨论】:

          • Map&lt;String,List&lt;Object&gt;&gt; tempObject= new HashMap&lt;String,List&lt;fakeclass&gt;&gt;(); 行不应该编译。它期望 ListObject 和你给它 ListFakeClass。 Java 泛型不允许这样的赋值,因为List&lt;FakeClass&gt;List&lt;Object&gt; 不协变。原因是可以将String 插入List&lt;Object&gt;,但List&lt;FakeClass&gt; 不允许这样做。
          • 是的,所以您进行了编辑更改。你不反对它。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-28
          • 2012-10-30
          • 1970-01-01
          • 2021-09-25
          • 2018-10-09
          • 2015-06-07
          相关资源
          最近更新 更多