~~java匿名内部类型,求大牛解释,比较有挑战性~~

庚武讲堂 2012-07-22 11:20:37
查看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);

}

}

...全文
159 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
庚武讲堂 2012-07-25
  • 打赏
  • 举报
回复
关键是spring的HibernateCallback接口无构造也可以,亲~
sdojqy1122 2012-07-24
  • 打赏
  • 举报
回复

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

}
public abstract String doFoo(StuffAdd s);

}

加上构造方法,亲
庚武讲堂 2012-07-23
  • 打赏
  • 举报
回复
顶起来~~
庚武讲堂 2012-07-22
  • 打赏
  • 举报
回复
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
}
});

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧