가능한 한 적은 코드로이 문제를 해결하려고했습니다.반환 값에 Java 형식 매개 변수가있는 문제
아래와 같이 및 Table
클래스가있는 데이터베이스 테이블과 같은 테이블 구조를 정의했습니다. Table
은 본질적으로 의 목록입니다. 서브 클래스가 Table
과 의 특정 풍미를 정의하고 컴파일러가 한 유형의 행을 호환되지 않는 유형의 테이블에 넣으려는 부적절한 시도를 포착하기를 원합니다.
추상화 Agent
클래스는 매개 변수를 취하고 T
유형의 행을 사용하는 테이블을 반환하는 메소드를 제공합니다. 나는 내가 가지고있는 문제를 설명하기 위해 세 가지 방법을 정의했다.
FinalAgent
, FinalTable
및 FinalRow
클래스는 Agent
, Table
및 Row
클래스 구현을 정의한다. 궁극적으로, 내가 원하는 것은 method2a
이며, 이는 매개 변수 목록을 받아 FinalTable
유형의 테이블을 반환합니다.
public abstract class Row {}
public abstract class Table<T extends Row> {}
public abstract class Agent {
public <T extends Row> Table<T> method1(List<String> parameter) {
return null;
}
public <T extends Row> Table<T> method2a(List<String> parameter) {
return null;
}
public <T extends Row> Table<T> method2b(String parameter) {
return null;
}
}
public class FinalRow extends Row {}
public class FinalTable extends Table<FinalRow> {}
public class FinalAgent extends Agent {
@Override
public <T extends Row> Table<T> method1(List<String> parameter) {
return null;
}
@Override
public FinalTable method2a(List<String> parameter) {
return null;
}
@Override
public FinalTable method2b(String parameter) {
return null;
}
}
하단에서
: FinalAgent
컴파일의
method1
,하지만 난 메소드를 호출하기 위해Table<FinalRow> t1 = new FinalAgent().method1(null);
를 작성해야합니다.FinalAgent
의method2a
나는 내가 실제로 (내가FinalTable t2a = new FinalAgent().method2a(null);
를 작성하려는) 반환하고 무엇을 반영하기 위해FinalTable
에 반환 형식을 변경하지만, 컴파일러는 오류 발생 : 유형의 FinalAgent의 방법 method2a (목록) 오버라이드 (override) 또는를 구현해야합니다 슈퍼 유형 메소드method3
매개 변수를List
에서String
으로 변경했습니다. 메서드는 OK를 컴파일하지만 나에게 적어도 작업 할 수있는 형식 안전 경고를줍니다.
그래서, 결국, 문제는 : 그것은 FinalAgent
에 method2a
아직 method2b
컴파일되지 않습니다 만, 이것은 컴파일러의 버그가 컴파일 않습니다 있습니까?
나는 또한 물을 수도 있습니다, 내가하고있는 일을하는 더 좋은 방법이 있습니까?
@ElliottFrisch? – shmosel
@shmosel 실수로, FinalTable 선언에서 제네릭 타입을 놓쳤습니다. –
궁금한 불일치입니다. – shmosel