如何从Java中的父类返回子类?

时间:2018-04-07 12:08:56

标签: java android

我有这个问题,我根本无法理解。我目前正在为学校开发一个Android项目。我有一种情况,我有一个父模型类和其他几个扩展它。这些模型都具有类似的存储机制(数据库)。因此,findAll()等方法调用对于所有模型来说都或多或少相同。如何在父类中实现此findAll()调用,该类将返回作为调用者子类类型的对象的ArrayList?

到目前为止,这是我的代码的一部分:

DEModel.java

public abstract class DEModel {

    private static final String apiBasePath = "http://10.0.0.2:3000/api/";

    public static ArrayList<> getAll() {
        // 1. Make the API call
        // 2. Get the JSON result
        // 3. Extract objects from the JSON by calling the appropriate
        //    parser depending on the object type
        // 4. wrap the objects in an ArrayList and return them
    }
}

Hotel.java

public class Hotel extends DEModel {
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayList<Hotel> hotels = Hotel.getAll();
    }
}

DEModel.java文件中,如何指定可以从调用者子类中自动计算出来的类型?我甚至可以在静态环境中这样做吗?

谢谢, 塔姆拉特

1 个答案:

答案 0 :(得分:1)

你可以使用接口 java中最好的多态多态

  • 像DataObject一样创建smth的空接口
  • 让酒店和其他人实现它
  • 现在可以将它们视为同一个对象DataObject

界面

public interface DataObject {
}

酒店

public class Hotel extends DEModel implements DataObject {
}

模型

public abstract class DEModel {

    private static final String apiBasePath = "http://10.0.0.2:3000/api/";

    public static ArrayList<DataObject> getAll() {
        // 1. Make the API call
        // 2. Get the JSON result
        // 3. Extract objects from the JSON by calling the appropriate
        //    parser depending on the object type
        // 4. wrap the objects in an ArrayList and return them
    }
}

所以你可以使用

ArrayList<DataObject> hotels = Hotel.getAll();

注意你必须将每个对象都投射到酒店以使用它的方法和变量,就像那样

ArrayList hotels = Hotel.getAll(); for(DataObject obj:hotels)    酒店h =(酒店)obj    h.getStarRating()//某些方法绑定到Hotel而不是DataObject

您也可以使用

if (obj is instanceof Hotel)
    // do something

obj.getClass().getName()

但这些方法输出取决于您在DataObject

中首先创建getAll()的方式