具有2种不同类型的对象数据

时间:2014-07-04 06:25:27

标签: java android

我有以下内容:

public class Notifier{
    CustomPlayer mCustomPlayer;
    CurrentPlayer mCurrentPlayer;
}

public class MainActivity extends Activity{

    public void onCreate(){
        Notifier ntf = new Notifier();
        if( index == 0){
            ntf.mCustomPlayer = new CustomPlayer(this);
        }
        else{
            ntf.mCustomPlayer = new CurrentPlayer(this); // having problem here
        }
    }
}

在Notifier类中,我只想让一个对象mCustomPlayer在MainActivity类中的CustomPlayer和CurrentPlayer之间切换。

我尝试在Notifier类中添加以下内容,

public class Notifier{
    CustomPlayer mCustomPlayer;
    CurrentPlayer mCurrentPlayer;

    public Object getType(int index) {
        if (index == 1) {
            return CurrentPlayer.class;
        }
        else {
            return CustomPlayer.class;
        }
    }
}

在尝试初始化MainActivity类中的mCustomPlayer时,我遇到了问题。

ntf.mCustomPlayer = new (ntf.mCustomPlayer)getType(0); // compile error

有没有办法实现这一点?
自从我尝试配置正确的实施以来,已经过了一天 在这种情况下我应该使用Interface吗?

3 个答案:

答案 0 :(得分:3)

要使用new关键字,您必须提供课程(即new MyClass())。

可以使用反射......但是为CustomPlayer和{{1}创建一个共同的超类(或接口)并不简单}?

例如,假设CurrentPlayerCustomPlayer都有CurrentPlayerplayOne()方法。然后你可以定义:

playTwo()

然后使用public interface Player { void playOne(); void playTwo(); } public class CurrentPlayer implements Player { @Override public void playOne() { // code } @Override public void playTwo() { // code } } private class CustomPlayer implements Player { @Override public void playOne() { // code } @Override public void playTwo() { // code } } public class Notifier { Player mPlayer; } 或新mPlayer分配new CurrentPlayer()然后您可以调用界面上的任何方法。

答案 1 :(得分:2)

您可以使用反射:

public class Notifier{

    public CommonInterface getInstance(int index, Class<Activity> activity){
      Class<?> claz = getType(0);
      Constructor<?> cons = claz.getConstructor(activity);
      return (CommonInterface) cons.newInstance(this);
      //or you could just type cast it manually if you do not wish to use CommonInterface
}

但拥有通用界面是正确的方法。你不必担心反思。

答案 2 :(得分:0)

由于您对这两个类具有相同的功能,因此请使用interface并访问该对象 -

public class MainActivity extends Activity{
    interface CurrentPlayer  { void game(); }
    interface CustomPlayer   { void game(); }

    interface Player extends CurrentPlayer, CustomPlayer { }

     public void onCreate(){
        Player swan = new Player() {
            @Override 
            public void game() {
                System.out.println("Swan Player");  //Swan Player
            }
        };
     }
}