실존 유형은 인터페이스와 어떻게 다릅니 까?


11

존재 유형이 주어짐

T = X.{op₁:X, op₂:Xboolean}

그리고이 일반적인 Java 인터페이스 :

interface T<X> {
    X op₁();
    boolean op₂(X something);
}

실존 유형과 Java 인터페이스의 근본적인 차이점은 무엇입니까?

분명히 구문상의 차이점과 Java의 객체 지향 (숨겨진 this매개 변수 등과 같은 세부 사항도 포함 )이 있습니다. 나는 너무 많은 개념과 의미 차이에서 이들에 관심이 아니에요 - 누군가가 (예 사이의 표기 차이로 약간의 미세한 점에 빛을 창고 좋아하면 비록 TT<X>), 그 너무 감사하겠습니다.


답변:


4

흠 ... 그 정의는 오래 전에 본 일부 하스켈 샘플과 매우 유사 해 보입니다.

{-# LANGUAGE ExistentialQuantification #-}
data X = forall a . X { value :: a, viewValue :: a -> String }
instance Show X where show (X { value = x, viewValue = f}) = f x
sample :: [X]
sample = [X 3 show, X "abc" show, X 3.14 show]

생성자 X가 적용될 때 실제로는 ∀가됩니다. 꺼내면 value유형을 모르고 그 위에 빈 작업 집합이 있습니다. 그러나 viewValue좀 일관성이 value있기 때문에 적용 할 수 있습니다.

나는 자바의 주요 차이점 추측 interface당신이 제안이 당신의 결과를 전달하는 중간 타입을 알고 있다는 사실이다 op₁에를 op₂. 즉, 실존 유형에 적합한 시스템은 조건에 따라 존재하는 올바른 유형을 선택해야합니다. 즉, 유형이 다음과 같은 함수를 작성할 수 있어야합니다 ∀X. X→(X→boolean)→T. 이전 샘플에서 그러한 함수는 X생성자에서 사용됩니다 X 3 show( show구현 Show하고 리턴 하는 모든 유형의 인수를 취하는 함수입니다 String)

업데이트 : 나는 당신의 질문을 다시 읽고 Java에 대한 적절한 구성을 가지고 있다고 생각합니다.

interface T {
    boolean op₂();
}
...
T x = new T() {
    private final int op = ...;
    public boolean op₂() { return ((op % 2) == 0); }
};
T y = new T() {
    private final char op = ...;
    public boolean op₂() { return ('0' <= op && op <= '9'); }
};
if (x.op₂() && y.op₂()) ...

당신은 언급에 대해 옳습니다 this-그것은 실제로 당신의 op₁입니다.

그래서 고전 OOP 언어 (Java, C #, C ++ 등)는 항상 단일 값으로 존재 유형을 구현 this하고 그 값으로 암시 적으로 호출되는 "메소드"라는 함수를 구현한다는 것을 알았 습니다. :)

추신 : 죄송합니다. Java에 익숙하지 않지만 아이디어가 있기를 바랍니다.


여기에 기능 프로그래밍 지원을 위해 Java 8에 도입 된 SAM (Single Abstract Method) 유형을 살펴보고자합니다.
Martijn Verburg

2

유일한 차이점은 Java 인터페이스가 실제로 Java 컴파일러에 무언가를 의미한다는 것입니다.

실재 유형은 모든 언어에 고유하지 않은 유형 의 공식적인 정의입니다. 컴퓨터 과학자들은 이런 종류의 정의를 사용하여 유형과 구현하는 언어에 대한 것을 증명합니다. Java 인터페이스는 공식적으로 정의 된 유형의 Java 구현 중 하나입니다.


아니. cf 윌리엄 쿡 페이퍼.
nicolas

2

제시된 2 가지 유형은 서로 매우 다릅니다. 작성한 인터페이스 정의는 범용 유형입니다 (일반적으로 Java 제네릭이이 범주에 속함).

실재 유형은 구현에서 유형을 소비자로부터 숨 깁니다. 직관적으로 X가 T에 존재하기 위해서는 X의 정체성을 어떤 소비자로부터도 알 수 없습니다. 알아야 할 것은 정의에 제공된 일련의 작업입니다. 일부 유형 X에는 하나의 유형 T가 있습니다.

반대로, 범용 유형은 소비자가 자유롭게 선택할 수있는 모든 유형에 적용 가능한 작업을 정의합니다. 인터페이스 유형 T는 바로 그 것입니다. X는 소비자에 의해 인스턴스화되며, X는 정확히 어떤 유형 X인지 알게됩니다. 유니버스의 모든 유형 X에 대해 유형 T가 있습니다.

와일드 카드 ( List<?>) 의 제한된 경우를 제외하고는 Java에서 실체가 실제로 언어 구성으로 존재하지 않습니다 . 그러나 그렇습니다. 인터페이스로 에뮬레이트 할 수 있습니다. 그러면 문제는 더 많은 디자인이됩니다.

알다시피, 객체 지향 설정에서 실체는 구현하기 까다로워집니다. 일반적으로 X의 유형 정보를 인코딩하는 방식 (X로 수행 할 수있는 것)은 X가 구현하는 인터페이스 유형의 멤버 함수를 갖는 것입니다. 요컨대, 인터페이스는 일부 유형의 추상화 기능을 구입할 수 있지만 어느 정도까지는 실존성을 제거해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.