2014-08-31 1 views
0

나는 다음과 같은 추상 클래스가이 클래스는 두 개의 다른 클래스에 의해 확장일부 캐스팅 문제 :

public abstract class AbstractService extends Service { 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 
} 

:

public abstract class AbstractMessengerService extends AbstractService { 
static final int MSG_REGISTER_CLIENT = 9991; 
static final int MSG_UNREGISTER_CLIENT = 9992; 

ArrayList<Messenger> mClients = new ArrayList<Messenger>(); // Keeps track of all current registered clients. 
final Messenger mMessenger = new Messenger(new IncomingHandler()); // Target we publish for clients to send messages to IncomingHandler. 

private class IncomingHandler extends Handler { // Handler of incoming messages from clients. 
    @Override 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
      case MSG_REGISTER_CLIENT: 
       Log.i("MyService", "Client registered: " + msg.replyTo); 
       mClients.add(msg.replyTo); 
       break; 
      case MSG_UNREGISTER_CLIENT: 
       Log.i("MyService", "Client un-registered: "+msg.replyTo); 
       mClients.remove(msg.replyTo); 
       break; 
      default: 
       //super.handleMessage(msg); 
       onReceiveMessage(msg); 
     } 
    } 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    onStartService(); 

    Log.i("MyService", "Service Started."); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i("MyService", "Received start id " + startId + ": " + intent); 
    return START_STICKY; // run until explicitly stopped. 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return mMessenger.getBinder(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    onStopService(); 

    Log.i("MyService", "Service Stopped."); 
} 

protected void send(Message msg) { 
    for (int i=mClients.size()-1; i>=0; i--) { 
     try { 
      Log.i("MyService", "Sending message to clients: "+msg); 
      mClients.get(i).send(msg); 
     } 
     catch (RemoteException e) { 
      // The client is dead. Remove it from the list; we are going through the list from back to front so this is safe to do inside the loop. 
      Log.e("MyService", "Client is dead. Removing from list: "+i); 
      mClients.remove(i); 
     } 
    } 
} 

public abstract void onStartService(); 
public abstract void onStopService(); 
public abstract void onReceiveMessage(Message msg); 

} 

을 그리고 :

public abstract class AbstractAIDLService extends AbstractService { 
private Handler handler; 
ArrayList<Messenger> mClients = new ArrayList<Messenger>(); // Keeps track of all current registered clients. 

private final IRemoteService.Stub mBinder = new IRemoteService.Stub() { 
    public int getPid(){ 
     return android.os.Process.myPid(); 
    } 

    @Override 
    public void setActivityColor(String color, long startTime) throws RemoteException { 
     long elpsedTime = (System.nanoTime() - startTime)/(1000 * 1000); 
     showElpesedTime(String.valueOf(elpsedTime)); 
    } 

    public void basicTypes(int anInt, long aLong, boolean aBoolean, 
          float aFloat, double aDouble, String aString) { 
     // Does nothing 
    } 
}; 

private void showElpesedTime(final String time) 
{ 
    handler.post(new Runnable() { 
     public void run() { 
      Toast toast = Toast.makeText(AbstractAIDLService.this, "Time passed reaching the server: "+time+"ms", Toast.LENGTH_SHORT); 
      toast.show(); 
     } 
    }); 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    onStartService(); 
    Log.i("MyService", "Service Started."); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    Log.i("MyService", "Received start id " + startId + ": " + intent); 
    return START_STICKY; // run until explicitly stopped. 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return mBinder; 
} 


@Override 
public void onDestroy() { 
    super.onDestroy(); 

    onStopService(); 

    Log.i("MyService", "Service Stopped."); 
} 

public abstract void onStartService(); 
public abstract void onStopService(); 
public abstract void onReceiveMessage(Message msg); 

} 

지금 나는 콘크리트를 만들 팩토리 클래스 인 ServiceManager 클래스를 생성 버전을 생성하여이 관리자 클래스에 전달했습니다.
public class ServiceManager { 

private static final String TAG = ServiceManager.class.getSimpleName(); 
private Class<? extends AbstractService> mServiceClass; 

    public ServiceManager(Context context, ServiceType type, Class<? extends AbstractService> serviceClass, Handler incomingHandler) { 
    this.mActivity = context; 

    this.mIncomingHandler = incomingHandler; 
    if (type.equals(ServiceType.AIDL)) { 
     this.mServiceClass = (AbstractAIDLService) serviceClass; 
    } else if (type.equals(ServiceType.MESSENGER)) { 
     this.mServiceClass = (AbstractMessengerService) serviceClass; 
    } 

    if (isRunning()) { 
     doBindService(); 
    } 
} 

그러나 어떤 이유로, 그 라인에 대한

: this.mServiceClass = (AbstractAIDLService) serviceClass;, this.mServiceClass = (AbstractMessengerService) serviceClass; 나에게 캐스팅 문제를주고 내가이 ServiceManager에있는 생성자를 가지고있다. 어떻게이 일을 할 수 있는지 아는 사람이 있습니까?

미리 감사드립니다.

답변

0

나는 생각 당신 ServiceManager 서로 다른 클래스이기 때문에 당신이 Class<? extends AbstractService> mServiceClassAbstractAIDLService 또는 AbstractMessengerService 할당 할 수 없습니다 및 클래스가 다른 두의 아버지 클래스가 아닙니다.

난 당신이 뭘 하려는지 모르겠지만이 작동합니다 :

public class ServiceManager { 

private static final String TAG = ServiceManager.class.getSimpleName(); 
private AbstractService mServiceClass; 

    public ServiceManager(Context context, ServiceType type, AbstractService serviceClass, Handler incomingHandler) { 
    this.mActivity = context; 

    this.mIncomingHandler = incomingHandler; 

    this.mServiceClass = serviceClass; 


    if (isRunning()) { 
     doBindService(); 
    } 
} 

을 그리고 다른 변수에 ServiceType 자리를 저장합니다.

+0

네, 실제로이 작업을 수행 할 수 있습니다.하지만 내가하려는 것은 전달 된 클래스의 구체적인 클래스를 추상 클래스 대신 ServiceManager의 생성자에 가져 오는 것입니다. –

+0

내가 아는 유일한 해결책은 2 개의 getter 메소드를 생성하는 것입니다. 하나의 getter 만 있으면 초 추상 클래스를 반환해야하기 때문에 2 가지 유형 각각에 하나씩 있습니다. AbstractService getService(); – sergiomse