在Erlang中使用Dialyzer行为模拟接口

时间:2014-03-10 20:42:42

标签: java interface erlang dialyzer

我想在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);
}

1 个答案:

答案 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