我想在Erlang中使用Java接口。如何为透析器提供-spec
合同,使我能够尽可能接近Java中提供的功能?
假设我想要与此相当的东西:
//Filename: Sports.java
public interface Sports
{
public void setHomeTeam(String name);
public void setVisitingTeam(String name);
}
//Filename: Football.java
public interface Football extends Sports
{
public void homeTeamScored(int points);
public void visitingTeamScored(int points);
public void endOfQuarter(int quarter);
}
//Filename: Hockey.java
public interface Hockey extends Sports
{
public void homeGoalScored();
public void visitingGoalScored();
public void endOfPeriod(int period);
public void overtimePeriod(int ot);
}
答案 0 :(得分:3)
您可以使用-callback
属性实现此目的:
%% Filename: sport.erl
-module(sport).
-callback setHomeTeam(Name :: string()) -> ok.
-callback setVisitingTeam(Name :: string()) -> ok.
然后,只要您想提供此界面:
-behavior(sport).
然而,我现在无法想到在行为之间进行继承的方法。您可以使用包含相关-behaviour
属性的包含.hrl文件来模拟它,而不是逐字指定它们,但这会感觉很脏。
如果行为模块与使用它们或已经在PLT中的模块一起进行分析,则Dialyzer将检查回调是否满足指定的-specs
。