首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >M3 Java:如何检查类是否实现了接口中的函数

M3 Java:如何检查类是否实现了接口中的函数
EN

Stack Overflow用户
提问于 2019-08-16 13:41:59
回答 2查看 224关注 0票数 1

我正在尝试编写一个分析来检查一个类是否实现了|java+method:///java/lang/Comparable/compareTo(T)|. Comparable.compareTo

我试着玩M3但是使用下面的代码,methodOverrides根本不包含compareTo。

代码语言:javascript
复制
//Geometric.java
public interface Geometric extends Comparable<Geometric> {
    public double area();
}
代码语言:javascript
复制
//Circle.java
public class Circle implements Geometric {

    private double r;
    private double x;
    private double y;

    public Circle(double x, double y, double r) {
        this.x = x;
        this.y = y;
        this.r = r;
    }

    @Override
    public double area() {
        return Math.PI * Math.pow(r, 2);
    }

    @Override
    public int compareTo(Geometric o) {
        return (int) (area() - o.area());
    }

    @Override
    public String toString() {
        return "Circle...";
    }

}

当使用createM3FromDirectory加载这些文件时,M3方法覆盖只包含一个条目:

代码语言:javascript
复制
<|java+method:///Circle/area()|,|java+method:///Geometric/area()|>

在M3中,是否有一种方法可以利用某些关系的传递闭包来得出结论:|java+method:///Circle/compareTo(Geometric)|覆盖了|java+method:///java/lang/Comparable/compareTo(T)|

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-19 11:48:41

我不敢相信我所看到的。我刚试了一次,现在起作用了。

代码语言:javascript
复制
//Main.rsc
module Main

import IO;
import lang::java::m3::Core;

void main(list[str] args)
{
    loc projectDir = |file:///| + args[0];
    M3 model = createM3FromDirectory(projectDir);

    for( ov <- model.methodOverrides ) { println(ov); }
}

内食无赖控制台:

代码语言:javascript
复制
rascal>main(["/home/mkl/radboud/src/java-feedback/java-feedback-rascal/test-data/assignment03-override-not-detected"]);
Reloading module Main
<|java+method:///Circle/toString()|,|java+method:///java/lang/Object/toString()|>
<|java+method:///Circle/area()|,|java+method:///Geometric/area()|>
<|java+method:///Circle/compareTo(Geometric)|,|java+method:///java/lang/Comparable/compareTo(T)|>

就是:循环实际上实现了Comparable.compareTo。<|java+method:///Circle/compareTo(Geometric)|,|java+method:///java/lang/Comparable/compareTo(T)|>

我想问题是我用了两种不同版本的流氓。Rascal,似乎是一个较旧的版本,给出了不同的结果。

使用流氓壳:

代码语言:javascript
复制
$ java -Xmx1G -Xss32m -jar ~/tmp/rascal-shell-stable.jar Main.rsc /home/mkl/radboud/src/java-feedback/java-feedback-rascal/test-data/assignment03-override-not-detected
Version: unknown
<|java+method:///Circle/area()|,|java+method:///Geometric/area()|>

我想我只是在耍流氓。当从内部eclipse运行时,它会给出正确的结果。

据我所知,它如预期的那样起作用。

我知道M3只记录即时的事实,在需要的时候我必须自己计算传递闭包。

票数 0
EN

Stack Overflow用户

发布于 2019-08-17 09:18:25

目前,M3只存储与直接超类和接口相关的方法重写。如果在项目中声明了传递接口和超级类型,则可以使用implementsextends关系的传递闭包,然后对declarationscontainment关系进行交叉检查。但是,您需要注意的是,在外部依赖项(例如Comparable<T>)的情况下,您不会在M3中获得所有所需的信息。因此,这并不是解决所有案件的一般解决办法。如果仍然希望检查项目实体的方法重写,请考虑以下步骤(这只是一个可能的解决方案):

  1. 计算implements关系的传递闭包。
  2. 计算extends关系的传递闭包。
  3. 根据您正在检查的类型和聚合两个集合(即transImpl[|java+class://main/MyClass|] + transExt[|java+class://main/MyClass|]),对这两个关系进行支持。
  4. 考虑containment关系中与MyClass类型及其传递父类型相关的方法。
  5. MyClass方法的签名与传递父类型方法进行比较(请注意每个方法的可见性;应该只考虑protectedpublic方法)。

无论如何,我们已经在Rascal存储库中打开了一个新的问题,以进一步分析您的查询。谢谢你的报道。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57525714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档