이 기간에 저는 일종의 추상화가 필요한 프로젝트를 진행하고 있지만 Java 제네릭 및 유형 추론과 관련된 몇 가지 문제를 해결하는 방법을 모릅니다.
이것은 소스 코드의 단순화 된 아키텍처입니다.
public abstract class BaseDataset
{
// Some data
// Some methods
}
public class DerivedDataset1 extends BaseDataset
{
// Some data
// Implementations of some BaseDataset methods
// Some additional methods
}
public class DerivedDataset2 extends BaseDataset
{
// Some data
// Implementations of some BaseDataset methods
// Some additional methods
}
public interface BaseMeasure<T extends BaseDataset>
{
public float evaluate(T dataset);
}
public class DerivedMeasure1 implements BaseMeasure<DerivedDataset1>
{
@Override
public float evaluate(DerivedDataset1 dataset)
{
// evaluate some measure using DerivedDataset1 methods
return the evaluated measure;
}
}
public class DerivedMeasure2 implements BaseMeasure<DerivedDataset2>
{
@Override
public float evaluate(DerivedDataset1 dataset)
{
// evaluate some measure using DerivedDataset2 methods
return the evaluated measure;
}
}
public class SocialNetworkBuilder
{
public <T extends BaseDataset> void build(T dataset, BaseMeasure<T> measure)
{
float weight = measure.evaluate(dataset);
// ...
}
}
내 문제는 내 메인 클래스에서 다음과 같이 작성하는 것입니다.
public class Application
{
public static void main(String [] args)
{
BaseDataset dataset = new DerivedDataset1();
BaseMeasure<? extends BaseDataset> measure = new DerivedMeasure1();
SocialNetworkBuilder socialNetworkBuilder = new SocialNetworkBuilder();
socialNetworkBuilder.build(dataset, measure);
}
}
Eclipse에서 "SocialNetworkBuilder 유형의 build (T, BaseMeasure) 메소드는 인수 (BaseDataset, BaseMeasure)에 적용 할 수 없습니다."라는 오류가 표시됩니다.
문제는 "build"방법이 데이터 세트와 측정 값이 동일한 유형 T인지 확인해야한다는 것입니다.
다음과 같이하면 :
public class Application
{
public static void main(String [] args)
{
BaseDataset dataset = new DerivedDataset1();
BaseMeasure<? extends BaseDataset> measure = new DerivedMeasure1();
SocialNetworkBuilder socialNetworkBuilder = new SocialNetworkBuilder();
socialNetworkBuilder.build((DerivedDataset1) dataset, (DerivedMeasure1) measure);
}
}
작동하지만 컴파일 타임에 "dataset"및 "measure"인스턴스의 파생 유형을 모르기 때문에 이런 방식으로 문제를 해결할 수 없습니다. "dataset"및 "measure"는 런타임에 제공된 일부 매개 변수에 따라 인스턴스화되어야합니다.
런타임에 "measure"및 "dataset"변수를 인스턴스화하고 "build"메서드를 호출 할 수 있어야합니다.
이 문제를 해결할 아이디어가 있습니까?
감사합니다.
다음과 같이 변경하면 애플리케이션이 컴파일됩니다.
public class Application
{
public static void main(String [] args)
{
DerivedDataset1 dataset = new DerivedDataset1();
BaseMeasure<DerivedDataset1> measure = new DerivedMeasure1();
SocialNetworkBuilder socialNetworkBuilder = new SocialNetworkBuilder();
socialNetworkBuilder.build(dataset, measure);
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다