查看hibernate源碼发现:/**  from: spring-framework-2.5.6.jar  **/
/*      */ public class HibernateTemplate extends HibernateAccessor
/*      */   implements HibernateOperations
/*      */ {//.............../*      */   public Object get(String entityName, Serializable id, LockMode lockMode)
/*      */     throws DataAccessException
/*      */   {
/*  544 */     return executeWithNativeSession(new HibernateCallback(lockMode, entityName, id) {
/*      */       public Object doInHibernate(org.hibernate.Session session) throws HibernateException {
/*  546 */         if (this.val$lockMode != null) {
/*  547 */           return session.get(this.val$entityName, this.val$id, this.val$lockMode);
/*      */         }
/*      */ 
/*  550 */         return session.get(this.val$entityName, this.val$id);
/*      */       }
/*      */     });
/*      */   }//.........../** from: spring-framework-2.5.6.jar **/
public abstract interface HibernateCallback
{
  public abstract Object doInHibernate(Session paramSession)
    throws HibernateException, SQLException;
}
HibernateTemplate 类的get方法使用了匿名内部类,HibernateCallback是接口。
疑问是:new HibernateCallback(lockMode, entityName, id)为什么可以带参数?
其它地方还可以带其它不同个数的参数,求大牛解释。java的接口有这种用法吗?
我自己写的为什么不行:/*********  StuffAdd.java    ***********/
package com.fooo.interfacedemo;public class StuffAdd { private String data;

public void add(Object o){
this.data += o.toString();
} public String getData() {
return data;
} public void setData(String data) {
this.data = data;
}

}
/*********  IFooInterface .java    ***********/package com.fooo.interfacedemo;public abstract interface IFooInterface { public abstract String doFoo(StuffAdd s);

}/*********  FooInterfaceClient .java    ***********/
package com.fooo.interfacedemo;public class FooInterfaceClient { private StuffAdd sa; public StuffAdd getSa() {
return sa;
} public void setSa(StuffAdd sa) {
this.sa = sa;
} public Object foo1(IFooInterface inter) {
return inter.doFoo(sa);
}}/*********  TestIFooInterface .java    ***********/
package com.fooo.interfacedemo;public class TestIFooInterface {


private static void doFun(final int a,final String b, final float c){ FooInterfaceClient client = new FooInterfaceClient();
StuffAdd sa = new StuffAdd();
client.setSa(sa);
client.foo1(new IFooInterface(a,b,c) {

public String doFoo(StuffAdd s) {
s.add(a);
s.add(b);
s.add(c);

System.out.println(s.getData().toString());
}
});

}
/**
 * @param args
 */
public static void main(String[] args) {

doFun(1,"2",3.3f); }}

解决方案 »

  1.   

    The constructor Object(int, String, float) is undefined报错。
    上面的逻辑有一点问题,少了一句:
    client.foo1(new IFooInterface(a,b,c) {

    public String doFoo(StuffAdd s) {
    s.add(a);
    s.add(b);
    s.add(c);

    System.out.println(s.getData().toString());
    return s.getData(); //added
    }
    });
      

  2.   


    abstract class IFooInterface {
    IFooInterface(int a,String b,float c){

    }
        public abstract String doFoo(StuffAdd s);
        
    }加上构造方法,亲
      

  3.   

    关键是spring的HibernateCallback接口无构造也可以,亲~