2017-03-02 22 views
0

にキャストすることはできません私のキャスト?java.lang.Objectのは、私はこのコードを持っている私のアプリではjava.nio.channels.SocketChannel

public class SamplePoolableObjectFactory implements PoolableObjectFactory{ 
    private final static Log log = LogFactory.getLog(SamplePoolableObjectFactory.class); 

    /* (non-Javadoc) 
    * @see org.apache.commons.pool.PoolableObjectFactory#activateObject(java.lang.Object) 
    */ 
    public void activateObject(Object obj) throws Exception { 
     log.debug("Activate object ..." + obj.hashCode()); 
    } 
    /* (non-Javadoc) 
    * @see org.apache.commons.pool.PoolableObjectFactory#destroyObject(java.lang.Object) 
    */ 
    public void destroyObject(Object obj) throws Exception { 
     log.debug("Destroy object ..." + obj.hashCode()); 
     obj = null; 
    } 
    /* (non-Javadoc) 
    * @see org.apache.commons.pool.PoolableObjectFactory#makeObject() 
    */ 
    public Object makeObject() throws Exception { 
     Object obj = new Object(); 
     log.debug("Make object ..." + obj.hashCode()); 
     return obj; 
    } 
    /* (non-Javadoc) 
    * @see org.apache.commons.pool.PoolableObjectFactory#passivateObject(java.lang.Object) 
    */ 
    public void passivateObject(Object obj) throws Exception { 
     log.debug("Passivate object ..." + obj.hashCode()); 

    } 
    /* (non-Javadoc) 
    * @see org.apache.commons.pool.PoolableObjectFactory#validateObject(java.lang.Object) 
    */ 
    public boolean validateObject(Object obj) { 
     log.debug("Validate object ..." + obj.hashCode()); 
     return false; 
    } 
} 

public class SampleObjectPool extends GenericObjectPool { 
    private final static Log log = LogFactory.getLog(SampleObjectPool.class); 


    /** 
    * Constructor 
    * @param factory 
    */ 
    public SampleObjectPool(PoolableObjectFactory factory) { 
     super(factory); 
     log.debug("New pool created with factory ..."); 
    } 

    /** 
    * Constructor 
    * @param factory 
    * @param config 
    */ 
    public SampleObjectPool(PoolableObjectFactory factory, Config config) { 
     super(factory, config); 
     log.debug("New pool created with factory and config ..."); 
    } 

    /* (non-Javadoc) 
    * @see org.apache.commons.pool.ObjectPool#addObject() 
    */ 
    public void addObject() throws Exception { 
     log.debug("Add an object ..."); 
     super.addObject(); 
    } 
    /* (non-Javadoc) 
    * @see org.apache.commons.pool.ObjectPool#borrowObject() 
    */ 
    public Object borrowObject() throws Exception { 
     log.debug("Borrow an object ..."); 
     return super.borrowObject(); 
    } 
    /* (non-Javadoc) 
    * @see org.apache.commons.pool.ObjectPool#invalidateObject(java.lang.Object) 
    */ 
    public void invalidateObject(Object obj) throws Exception { 
     log.debug("Invalidate an object ..."); 
     super.invalidateObject(obj); 
    } 
    /* (non-Javadoc) 
    * @see org.apache.commons.pool.ObjectPool#returnObject(java.lang.Object) 
    */ 
    public void returnObject(Object obj) throws Exception { 
     log.debug("Return an object ..."); 
     super.returnObject(obj); 
    } 
} 
+2

キャストに何も問題ありません。あなたのオブジェクトファクトリは単に 'SocketChannel'オブジェクトを返すのではなく、通常の' java.lang.Object'オブジェクトを返します。 – Kayaman

+0

@Kayaman私の工場はこの 'public class SamplePoolableObjectFactoryはPoolableObjectFactory'を実装しています – Mercer

+0

なぜ' Object'sを返すのですか? – Kayaman

答えて

2

以下は、GenericObjectPool.borrowObject()の抜粋です。

836    // create new object when needed 
837    boolean newlyCreated = false; 
838    if(null == pair) { 
839     try { 
840      Object obj = _factory.makeObject(); 
841      pair = new ObjectTimestampPair(obj); 
842      newlyCreated = true; 
843     } finally { 
844      if (!newlyCreated) { 
845       // object cannot be created 
846       _numActive--; 
847       notifyAll(); 
848      } 
849     } 
850    } 

あなたがmakeObject()を見ることができるようにはPoolableObjectFactoryの提供インスタンスで呼び出されるので、あなたはそれに応じて、このメソッドを実装する必要があります。

今はObjectのインスタンスのみを返します。もちろん、SocketChannelにキャストできません。

public Object makeObject() throws Exception { 
    SocketChannel obj = ... // create channel here 
    log.debug("Make object ..." + obj.hashCode()); 
    return obj; 
} 
2

あなたpublic Object makeObject()Objectを作成します。それをSocketChannelにキャストしようとしています。

猫が犬ではないのと同じように、Objectsは、キャストしようとしても、SocketChannelsではありません。

+0

'GenericObjectPool 'を作るにはどうすればいいですか – Mercer

+0

これはあなたの工場で 'makeObject()'を実装することで可能です。下の私の答えを見てください。 – mike

関連する問題