2013-05-20 3 views
5

Java의 일반적인 메소드를 이해하려고합니다. 내가 대신 AREA2 (또는 그 반대)의 영역 1을 구현/사용해야하는 이유를 이해/볼 수Java 일반 메소드 이해

public class GenericTest { 

    interface Shape { 
     public long area(); 
    } 

    public static class Triangle implements Shape 
    { 
     private long base, height; 
     public long area() { return (base * height)/2; } 
    } 

    public static class Rectangle implements Shape 
    { 
     private long width, height; 
     public long area() { return width * height; } 
    } 

    public <T extends Shape> long area1(T shape) 
    { 
     return shape.area(); 
    } 

    public long area2(Shape shape) 
    { 
     return shape.area(); 
    } 

} 

: 다음 코드를 감안할 때. 내가 놓친 게 있니? 두 가지 방법 모두 똑같은 일을하지 않습니까? 그것은 내게 남아있다

은 비트는 area1 방법을 만들기위한 좋은 이유가 없습니다 자바

+1

이 경우 제네릭을 사용하는 것은 의미가 없습니다. ** 유형을 알지 못하면 ** 저장 **해야합니다. –

+1

이 경우 @ LukasKnuth는 영역 2의 일반 버전을 만들지 않아도된다고 말했습니다(). 그러나 현재의 오라클 문서는 generics에 대한 훌륭한 예제를 보여줍니다. 와일드 카드 제네릭 예제 또한 혼란을 명확히하는 데 도움이 될 수 있습니다. http://docs.oracle.com/javase/tutorial/extra/generics/methods.html –

+0

에서 C++과 비슷한 제네릭을보고있었습니다. 템플릿. 여기에 다른 대답이 없다는 것을 지적한 중요한 점은 (그리고 아마도 내가 놓치고있는 것은 그들이 어떤 종류인지를 모를 때 ** 그들이 사용된다는 개념이라는 것입니다. 정확히 어느 것이 맞습니까 내가 대답을 찾고있는 곳 :-) – Xaq

답변

4

에 대한 제네릭을 혼동. area2 방법이 바람직합니다. 제네릭은 특정 아직 알려지지 않은 유형과의 관계가있을 때 사용됩니다. 여기에는 매개 변수 shape에 대한 구체적인 내용이 없습니다. 인터페이스 Shape을 사용하면 이미 area 메소드를 사용할 수 있으므로 Shape의 특정 구현이 shape으로 전달되는지는 신경 쓰지 않습니다. 따라서 제네릭은 여기에 필요하지 않습니다. T 형식 매개 변수가있는 반환 값에 사용되지 않기 때문에 당신의 예에서

public long area2(Shape shape) 
13

사용은 차이가 없다.

그러나, 당신은 다음과 같은 방법을 가지고 상상 : 여기

public <T extends Shape> T movedShape1(T shape) { 
    return shape.move(); 
} 

public Shape movedShape2(Shape shape) { 
    return shape.move(); 
} 

당신이 movedShape1()를 사용하여 명확한 장점을 볼 수 있습니다. 유형 안전성을 유지하면서 반환 값에 대해보다 구체적인 유형을 얻습니다.

+0

아직도 똑같은가? 나는 여분의 타입 안전성을 보지 못한다. 둘 다 리턴한다. – Xaq

+2

@ Xaq : 클래스'Circle implements Shape'을 가지고 있다면,'Circle' 매개 변수로'movedShape1()'을 호출하면'Shape'이 ​​아닌'Circle'이 리턴 될 것입니다. 같은'Circle' 매개 변수로'movedShape2()'를 호출하면'Shape'을 얻을 것입니다. – Keppil

+0

@Xaq, Keppil이 맞습니다. 그런 방법을 호출 할 때 매우 유용합니다. – dantuch

0

이 경우 - 모양이 (추상적 인) 클래스는 아니지만 인터페이스이므로 구현해야합니다 (생각의 거대한 형태로 확장) - 나는 그들이 같은 것을하고, 제네릭을 추가한다고 말하고 싶습니다. 실제로 일어나고있는 것만 섀도 잉