Java로 설명된 유형 클래스

4855 단어 javascalafunctional
By definition 유형 클래스는 임시 다형성을 지원하는 유형 시스템 구조입니다.

유형 클래스의 다음 측면을 설명하여 이 정의를 자세히 설명하겠습니다.
  • 해당 클래스 내에서 구현되지 않은 외부화
  • 제어하지 않는 클래스
  • 다중 구현 가능성
  • 합법성

  • 위에서 언급한 측면과 일반적인 상속 접근 방식과 반대되는 유형 클래스 접근 방식 간의 차이점을 보여주는 훌륭한 예는 Java 인터페이스 ComparableComparator 입니다.

    외부 대 내부 구현



    상속 방식을 사용하려면 비교할 인스턴스가 있는 클래스를 확장하고Comparable 메서드에 대한 구현을 추가해야 합니다compareTo. 반대로 유형 클래스 접근 방식을 취하면 Comparator 인스턴스를 구현합니다.

    우리가 통제하지 않는 수업



    비교하려는 클래스를 제어할 수 없는 경우에는 상속 방식을 사용할 수 없습니다. 예를 들어 클래스는 외부 종속성에서 가져옵니다.
    그 주위에는 방법이 있습니다. 때로는 불편할 수 있는 래퍼 클래스를 정의합니다. 유형 클래스 접근 방식에는 이러한 제한이 없습니다. 우리는 손에 넣을 수 있는 모든 클래스에 대해 인스턴스Comparator를 자유롭게 구현할 수 있습니다.

    단일 대 다중 구현


    Comparable를 사용하면 하나의 Comparable 구현으로 제한됩니다. 예를 들어 하위 클래스를 사용하고 각 하위 클래스에 대해 다른 구현을 정의하는 것과 같은 방법도 있습니다. 사용하는 언어에 따라 하나 이상의 유형 클래스 구현을 정의할 수 있습니다. scala는 여러 유형 클래스 구현을 허용하지만 동일한 해상도 수준에서 정의되지 않을 것으로 예상됩니다. 이에 대한 자세한 내용을 읽을 수 있습니다here. Haskell은 일반적으로 여러 유형 클래스 인스턴스를 허용하지 않습니다. 이 제한을 피하는 방법이 있지만.

    합법성



    모든 유형 클래스에는 모든 인스턴스가 준수해야 하는 일련의 법칙이 있습니다. Comparator 유형 클래스의 경우 예를 들면 다음과 같습니다.

    if x.equals(y) then x.compareTo(y) == 0
    
    if x.compareTo(y) == 0 then y.compareTo(x) == 0
    
    if x.compareTo(y) < 0 and y.compareTo(z) < 0
    then x.comapreTo(z) < 0
    


    일반적으로 이것은 클래스를 입력하기 위한 전부입니다. 이것은 단지 예일 뿐이지만 대부분 범주 이론에서 비롯된 유형 클래스가 많이 있습니다. 그러나 그것들을 사용하기 위해 해당 주제로 들어갈 필요는 없습니다. scala 유형에서 클래스는 Java 인터페이스에 매우 가까운 특성을 사용하여 구현됩니다.

    유형 클래스의 스칼라 구현과 관련하여 사람들을 가장 혼란스럽게 하는 부분은 유형 클래스의 실제 개념이 아닌 것 같지만 스칼라는 배후에서 마법을 암시합니다. 유형 클래스를 일급 구조로 정의하는 하스켈과 다르기 때문에 마법이 필요합니다.
    스칼라에서는 언어 핵심의 일부가 아니라 암시적 매개 변수 및 암시적 변환과 같은 다른 언어 기능을 사용하여 구현됩니다. 암묵적 표현은 특히 신규 이민자에게 혼란스러울 수 있지만 낙담하지 마십시오.

    결과적으로 특정 클래스의 인스턴스를 비교한다는 개념이 외부화됩니다. 상속 접근 방식을 사용하는 메서드 정의는 다음과 같습니다.

    // java
    public <A extends Comparable<A>> ResultType methodWhichNeedsToCompareInstances(A a)
    



    // scala
    def methodWhichNeedsToCompareInstances[A <: Comparable[A]](a: A): ResultType
    


    유형 클래스 접근 방식을 사용하는 동안 다음과 같이 표시됩니다.

    // java
    public <A> ResultType methodWhichNeedsToCompareInstances(A a)(Comparator<A> comparator)
    



    // scala
    def methodWhichNeedsToCompareInstances[A](a: A)
    (implicit comparator: Comparator[A]): ResultType
    


    내가 관심을 가졌다면 스칼라용 cats, scalaz 및 자바용 vavr과 같은 다음 라이브러리 중 하나를 살펴볼 수 있습니다. 이 라이브러리에는 공통 유형에 대한 유형 클래스 정의 및 구현이 포함되어 있습니다.

    좋은 웹페이지 즐겨찾기