문제

내 후속 조치로 이전 질문다음과 같은 일반적인 경계가있는 함수가 있습니다.

<T extends Foo & Bar> void doStuff(T argument) {
  //do stuff wich should only be done if arguments is both foo and bar
}

이것은 지정되지 않은 객체에서 캐스트 할 수 없기 때문에 실제로 이러한 인터페이스를 구현하는 일부 객체에 대한 지식이 있어야합니다. 전달할 객체 인수의 특정 유형을 알아야 할 것 같습니다. doStuff(T a) Demeter의 법을 위반 한 것입니다.

이 함수는 실제 클래스를 알아야 할 필요성을 지정하지 않으며 (많은 다른 클래스가있을 수 있음),이 클래스가 내 코드 기반의 종속성을 증가 시킨다는 것을 알고 있기 때문에 실제로 알고 싶지 않습니다.

이 경계를 사용하는 것은 반 패턴입니까? 그렇다면 어떻게 최선을 다해야합니까?

사례 시나리오에는 객체를 지정하는 하나의 인터페이스가 지속되고 다른 지정된 객체는 관련 엔티티를 갖습니다. 그만큼 doStuff(T a) 이 경우 기능은 지속될 때 관련 엔티티를 지속시켰다. 그러나 비기능 엔터티는 관련 엔티티를 가질 수 있지만 doStuff(T a) 기능

올바른 솔루션이 없습니다

다른 팁

나는 결합 된 일반적인 경계를 안티 패턴으로 간주하지 않을 것입니다. 적어도 나는 내 코드에서 그들에게 약간의 용도가 있습니다. 예를 들어, 다음 샘플 코드는 비교 인터페이스의 비교를 사용하여 컬렉션에서 가장 큰 숫자 인스턴스를 찾습니다.

<T extends Number & Comparable<T>> T max(Collection<T> numbers)

Dostuff (t a)에게 전달되는 특정 유형의 객체 주장을 알아야 할 것 같습니다.

나는 동의하지 않는다. 나는 방법이 없다

T<? extends Foo & Bar> void doStuff(T argument) 

그때 통과 할 논쟁에 대한 지식이 더 필요합니다

T<? extends Foo> void doStuff(T argument) 

또는 그저 더 이상

void doStuff(T argument) 

모든 경우에 당신은 논쟁에 대해 무언가를 알아야하며, 첫 번째 사례는 두 개의 식별자가 있기 때문에 다른 사례보다 더 이상 지식을 요구하고 있다고 생각하지 않습니다.

방지 방지가 캐스팅되고 있습니다.

그러나 멋진 제네릭 풋워크는 비 승인 된 프로그래머에게 혼란 스러울 수 있습니다. 이러한 유형과 방법의 사용은 구현보다 훨씬 쉬워야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top