簡體   English   中英

java.lang.Object無法轉換為java.nio.channels.SocketChannel

[英]java.lang.Object cannot be cast to java.nio.channels.SocketChannel

在我的應用程序中,我有以下代碼:

        SamplePoolableObjectFactory factory = new SamplePoolableObjectFactory();
        this.pool = new SampleObjectPool(factory);
.....

    SocketChannel channel = null;
            try {
    channel = (SocketChannel) this.pool.borrowObject();
....
}

我有這個錯誤:

Unable to borrow socket from pool java.lang.ClassCastException: java.lang.Object cannot be cast to 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);
    }
}

您的public Object makeObject()創建一個Object 您正在嘗試將其SocketChannel轉換為SocketChannel

就像貓不是狗一樣,無論您嘗試投射多少ObjectsObjects都不是SocketChannels

以下是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             }

如您所見,在提供的PoolableObjectFactory實例上調用了makeObject() ,因此您應該相應地實現此方法。

現在,您僅返回Object的實例,該實例當然不能轉換為SocketChannel

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM