Java对象范围

时间:2014-01-22 09:56:48

标签: java object scope

我正在尝试基于条件创建对象,因此对象创建在条件的范围内,但是我需要在该范围之外看到对象。我认为将它添加到地图会起作用,但它没有。请考虑以下示例:

TestModel.java

public class TestModel {
private String text;
public void setText(String text){
this.text = text;}
public String getText(){
return this.text;}
}

ScopeTest.java

import java.util.*;
class ScopeTest {

public static void main(String[] args) {

TestModel testModel;
Map<String, Object> myModel = new HashMap<String, Object>();

for (int i=1; i<2; i++){ // if a certain condition is met, create an object as below
    testModel = new TestModel();
    testModel.setText("test text");
    myModel.put("test", testModel);
    }

for (Map.Entry<String, Object> entry : myModel.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    System.out.println("key=" + key); // I can see the key value
    System.out.println("value.getText()=" + value.getText()); // but can't see testModel object. I am not sure how to resolve.
}
}
}

欢呼声,

Geofrey Rainey。

4 个答案:

答案 0 :(得分:2)

您必须使用类转换Object值。像这样。

System.out.println("value.getText()=" + ((TestModel) value).getText());

如果您不想投射物体,那么您可以这样使用。

class ScopeTest {

public static void main(String[] args) {

TestModel testModel;
Map<String, TestModel> myModel = new HashMap<String, TestModel>();//Use TestModel
                                                                instead of object

for (int i=1; i<2; i++){ 
    testModel = new TestModel();
    testModel.setText("test text");
    myModel.put("test", testModel);
    }

for (Entry<String, TestModel> entry : myModel.entrySet()) {
    String key = entry.getKey();
    TestModel value = entry.getValue();
    System.out.println("key=" + key); 
    System.out.println("value.getText()=" + value.getText()); 
}
}
}

答案 1 :(得分:1)

您应该将Object强制转换为模型。

TestModel value = (TestModel) entry.getValue();

答案 2 :(得分:0)

我认为您可能必须先将HashMap返回的对象转换为TestModel,然后才能使用该类的方法。

答案 3 :(得分:0)

为什么不在地图中使用TestModel作为通用类型的值,如下所示?

Map<String, TestModel> myModel = new HashMap<>();
//          ^^^^^^^^^ - instead of Object

这样您就可以使用

迭代地图
for (Map.Entry<String, TestModel> entry : myModel.entrySet()) {
    ...
}

您将能够在

中存储价值
TestModel value = entry.getValue();

无需投射。现在,由于value引用的类型为TestModel,编译器将允许您使用getText()之类的方法而不会出现问题。

System.out.println("value.getText()=" + value.getText());

如果你想迭代一次,我也不确定你为什么要使用循环。简单的if会更好。另一件事是使用Map来保持一个元素似乎是不必要的。你可以使用一个像

这样的引用
boolean someCondition = true;

TestModel testModel = null;
if (someCondition) { // if a certain condition is met, create
    testModel = new TestModel();
    testModel.setText("test text");
}

if (testModel!=null){
    System.out.println(testModel.getText());
}