2017-03-07 10 views
1

우리는 arraylist를 가진 자바 테스트 프로젝트를 만들었습니다.제약은 Java 코드를 리팩토링하기 위해 추론 된 타입을 해결합니다.

private ArrayList mainList; 

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

우리가 볼 수 있듯이 정수와 Test 클래스의 것을 추가합니다.

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의 정수를 볼 수 있고, 테스트가 mainList 첨가 얻을

: 는 레스 우리는 다음과 같이 구성 객체 흐름 그래프를 생성한다. 우리는 가장 낮은 유형 또는 일반화를 찾을 제약 해결사가 필요이를 위해> private ArrayList<Object> mainList

-이 지식을 사용하여 우리는 Object 유형 따라서 private ArrayList mainList을 포함해야하는 ArrayList를을 표시합니다. 따라서 우리는 다음과 같은 전파 방법 그러나

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; 
} 

의 해결 기능을 확대하려는, 우리가 어려운이 사용 불량배 우리는 IBM ILOG 경험이 시작 찾을 때문에 제약 프로그래밍은 새로운 것이 아니다.

+0

의 시작점을인가 발견하고 해결 시작할 수 있는가? – nvanson

답변

1

하나 개의 아이디어, 당신은 가능하거나 필요한 유형의 형식 매개 변수의 위치를 ​​관련 기능을 다른 기능 또는 그룹을 작성할 수 있습니다

  • 대다 rel[loc typeparameter, TypeSymbol bound 인코딩 수를 어떤 유형의 유형 매개 변수 분에서해야의 당신의 흐름 분석에 따라 그것에 유입되는 객체에 따라 최소한 하위 유형이어야합니다.
  • 그런 다음 대안을 기반으로 엄격한 상한선을 계산하는 알고리즘은 동일한 유형 매개 변수에 대해 여러 수퍼 유형을 결합하고 모두 포함하는 최소 유형을 계산합니다. 이 알고리즘을 사용하면 모든 유형 매개 변수에 대해 하나의 솔루션 만 남을 때까지 rel[loc typeparameter, TypeSymbol bound]을 더 작게 만들 수 있습니다.
    • java.lang.Object가의 최고 유형의 사실과 같이 공통의 슈퍼 유형에 대해 알아 보려면 M3 모델의 extendsimplements 관계를 사용할 수 있지만 당신은 또한 자바 타입 시스템에 대한 지식 구축한다 자바의 클래스와 인터페이스 모두, 클래스는 단일 상속을 갖고 인터페이스를 다중 상속합니다.

TypeSymbol는 OFG usend의 M3의 @의 typeDependency의 형식을 찾고, lang::java::m3::TypeSymbol