Extension Method扩展问题

为什么调用power方法报错
public class MyIntegerExt {
    public Integer square(Integer self) {
        return self * self;
    }

    public Double power(Integer self, Double exponent) {
        return Math.pow(self, exponent);
    }

    public Boolean isOdd(Integer self) {
        return self % 2 != 0;
    }
}
//配置Integer扩展方法
Engine.addExtensionMethod(Integer.class, MyIntegerExt.class);

#set(num = 123)
#(num.square())
#(num.power(10))//报错
#(num.isOdd())

image.png


解决方法:

数字常量:123  456F  789L  0.1D  0.2E10
//1.double参数 
Double power(Integer self, Double exponent)

#set(num = 123)
#(num.square())
#(num.power(10.0))或者#(num.power(10D))
#(num.isOdd())

//2.Integer参数
 Double power(Integer self, Integer exponent)
 
#set(num = 123)
#(num.square())
#(num.power(10))
#(num.isOdd())


评论区

hzcsc

2019-11-21 10:28

#(num.power(10.0))就可以成功

lyh061619

2019-11-21 10:31

看代码使用了系统保留的self关键字为参数名修改成其他的再试下。

JFinal

2019-11-21 10:45

@hzcsc 因为你的 power 方法原型是 Double power(Integer self, Double exponent),参数是 Double,所以在使用的时候只能接受 Double,进而 power(10.0) 可以成功

解决办法是再额外添加一个带 Integer 的方法,例如:
Double power(Integer self, Integer exponent)

或者将原来的方法中的 Double 改成 Number 试试
Double power(Integer self, Number exponent)

Rainboz

2019-11-21 10:47

JFinal

2019-11-21 11:01

@Rainboz 记得改定后回来在本贴子中补充代码,有不少要需要

opal

2019-11-21 11:23

这个,List,Map之类的,能添加这种扩展方法不?没试过。

JFinal

2019-11-21 12:21

@opal 针对具体的类扩展就可以,极度方便,例如针对 ArrayList、HashMap

而 List、Map 是接口不可以使用 extension method 扩展方式

Rainboz

2019-11-21 14:14

@JFinal 将原来方法Number后,#(num.power(10)),#(num.power(10.0))都找不到带Number的方法

JFinal

2019-11-21 14:38

@Rainboz 追加一个带 Integer 参数的 power 方法也挺好

chcode

2020-08-14 18:16

@JFinal 不支持子类吗?

JFinal

2020-08-14 21:32

@chcode Extension Method 不支持子类,因为站在 enjoy 的角度是否法预知子类有多少个的

当你需要子类也同时拥有这个扩展功能的时候,再多添加一行配置,将子类也配置进去就可以了

热门反馈

扫码入社