我有以下内容:
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吗?
答案 0 :(得分:3)
要使用new
关键字,您必须提供课程(即new MyClass()
)。
你可以使用反射......但是为CustomPlayer
和{{1}创建一个共同的超类(或接口)并不简单}?
例如,假设CurrentPlayer
和CustomPlayer
都有CurrentPlayer
和playOne()
方法。然后你可以定义:
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
}
};
}
}