将任何类型分配给变量

时间:2015-06-19 16:34:04

标签: java

我有两个不同类型的对象:

if (phone) {
        listView = (ObservableListView) getActivity().findViewById(R.id.castdetailscredits);
        if (listView != null) {
            listView.setOnItemClickListener(this);
            listView.setScrollViewCallbacks(activity.getCastDetailsFragment());
            listView.setTouchInterceptionViewGroup((ViewGroup) activity.getCastDetailsFragment().getView().findViewById(R.id.containerLayout));
            Bundle save = activity.getCastDetailsCreditsBundle();
            if (save != null) {
                moviesList = save.getParcelableArrayList("moviesList");
                movieAdapter = new MovieAdapter(getActivity(), R.layout.row, this.moviesList);
                listView.setAdapter(movieAdapter);
            }

        }
    } else {
        gridView = (ObservableGridView) getActivity().findViewById(R.id.castdetailscredits);
        if (gridView != null) {
            gridView.setOnItemClickListener(this);
            gridView.setScrollViewCallbacks(activity.getCastDetailsFragment());
            gridView.setTouchInterceptionViewGroup((ViewGroup) activity.getCastDetailsFragment().getView().findViewById(R.id.containerLayout));
            Bundle save = activity.getCastDetailsCreditsBundle();
            if (save != null) {
                moviesList = save.getParcelableArrayList("moviesList");
                movieAdapter = new MovieAdapter(getActivity(), R.layout.row, this.moviesList);
                gridView.setAdapter(movieAdapter);
            }

        }
    }

是否可以根据某些条件创建一个将指定其中一个对象的变量。然后打电话给他们的方法?它是通用类型的东西吗?对不起,如果有人问过,我不知道怎么叫这种技术。

编辑:我正在努力避免代码重复:

matCheck <- ( mat1 | !mat2 )

1 个答案:

答案 0 :(得分:1)

实际上有几种方法可以做到这一点:

<强>反射

//I don't know this object so I'm using a default constructor
ObservableListView listView = new ObservableListView(); 
ObservableGridView gridView = new ObservableGridView();

Object obj;

if(condition)
{
    obj = listView;
}
else
{
    obj = gridView;
}

Method method = obj.getClass().getMethod("methodname", param1.getClass(), param2.getClass());
try
{
    method.invoke(obj, param1, param2);
}catch(Exception e){}

<强>继承

//assuming that there is some parent class of both classes that contains methods that you would like to use
ObservableListView listView = new ObservableListView(); 
ObservableGridView gridView = new ObservableGridView();

ObservableView view;

if(condition)
{
    view = listView;
}
else
{
    view = gridView;
}

view.someMethod();

<强>接口

//this assumes that both ObservableListView and ObservableGridView implement some interface 'IObservableView'
ObservableListView listView = new ObservableListView(); 
ObservableGridView gridView = new ObservableGridView();

IObservableView view;

if(condition)
{
    view = listView;
}
else
{
    view = gridView;
}

view.someMethod();

<强> INSTANCEOF

//very flexible version. I think that this is the route I would choose
ObservableListView listView = new ObservableListView(); 
ObservableGridView gridView = new ObservableGridView();

Object obj;

if(condition)
{
    obj = listView;
}
else
{
    obj = gridView;
}

if(obj instanceof ObservableListView)
{
    ((ObservableListView)obj).someMethodOnlyInThisClass();
}
else if(obj instanceof ObservableGridView)
{
    ((ObservableGridView)obj).someOtherMethodOnlyInThisClass();
}

我会避免使用反射。

继承仅在您要使用的方法在两个类中并从超类继承时才有效。

如果超类没有相同的方法但两个子类都实现了接口,那么接口就可以工作。

instanceof可能是最灵活的解决方案,不会使用反射,虽然有些人会忽略它的使用。

因为您用更明确的目标更新了答案。这就是我要做的事。

AdapterView view = (AdapterView) getActivity().findViewById(R.id.castdetailscredits);

if(view != null)
{
    view.setOnItemClickListener(this);
    ((Scrollable)view).setScrollViewCallbacks(activity.getCastDetailsFragment());
    ((Scrollable)view).setTouchInterceptionViewGroup((ViewGroup) activity.getCastDetailsFragment().getView().findViewById(R.id.containerLayout));
    Bundle save = activity.getCastDetailsCreditsBundle();

    if (save != null) {
        moviesList = save.getParcelableArrayList("moviesList");
        movieAdapter = new MovieAdapter(getActivity(), R.layout.row, this.moviesList);
        view.setAdapter(movieAdapter);
    }
}

我们在上面提到了几种技术。特别是继承AdapterView)和接口Scrollable)。