gpt4 book ai didi

java - 约束解决推断类型以重构 Java 代码

转载 作者:行者123 更新时间:2023-11-30 06:51:37 26 4
gpt4 key购买 nike

我们创建了一个java测试项目,其中有一个数组列表。

private ArrayList mainList; 

public void AddTest(int number)
{
Test t = new Test();
mainList.add(t);
mainList.add(number);
}

可以看出,我们添加了一个整数和 Test 类的内容。在 rascal 中,我们创建一个对象流图,其中包含以下内容:

OFG: {
<|java+class:///java/util/ArrayList/this|,|java+constructor:///java/util/ArrayList/ArrayList()|>,
<|java+variable:///test1/Main/AddTest(int)/t|,|java+field:///test1/Main/mainList|>,
<|java+class:///test1/Main/this|,|java+constructor:///test1/Main/Main()|>,
<|java+parameter:///test1/Main/AddTest(int)/scope(number)/scope(0)/number|,|java+field:///test1/Main/mainList|>,
<|java+class:///test1/Test/this|,|java+constructor:///test1/Test/Test()|>,
<|java+class:///test1/Test/this|,|java+field:///test1/Main/mainList|>
}

从 OFG 中可以看出,一个整数和 Test 被添加到 mainList 中。利用这些知识,我们希望表明 ArrayList 应包含 Object 类型 private ArrayList mainList -> private ArrayList<Object> mainList

为此,我们需要一个约束求解器来找到最低类型或泛化。因此我们要增强以下传播方法的求解函数

rel[loc,&T] propagate(OFG g, rel[loc,&T] gen, rel[loc,&T] kill, bool back) {
rel[loc,&T] IN = { };
rel[loc,&T] OUT = gen + (IN - kill);
gi = g<to,from>;
set[loc] pred(loc n) = gi[n];
set[loc] succ(loc n) = g[n];

solve (IN, OUT) {
IN = { <n,\o> | n <- carrier(g), p <- (back ? pred(n) : succ(n)), \o <- OUT[p] };
OUT = gen + (IN - kill);
}

return OUT;
}

但是,我们发现使用 Rascal 来启动此操作很困难我们拥有 IBM ILOG 的经验,因此约束编程并不新鲜。

最佳答案

一个想法是,您可以编写另一个函数或一组函数,将类型参数位置与可能或必要的类型相关联:

  • 多对多rel[loc typeparameter, TypeSymbolbound可以根据流分析流入的对象对类型参数至少应该是子类型的类型进行编码.
  • 然后,基于替代方案计算严格上限的算法将组契约(Contract)一类型参数的多个父类(super class)型,并计算包含所有这些父类(super class)型的最小类型。该算法将使 rel[loc typeparameter, TypeSymbolbound] 变得越来越小,直到每个类型参数只剩下一个解决方案。
    • 您可以使用 M3 模型中的 extendsimplements 关系来了解常见的父类(super class)型,但您还应该了解一些有关 Java 类型系统的知识,例如 java.lang.Object 是 Java 中类和接口(interface)的顶级类型,类具有单继承性,接口(interface)具有多重继承性。

TypeSymbol 可以在lang::java::m3::TypeSymbol中找到

关于java - 约束解决推断类型以重构 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42657420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com