存在类型与接口有何不同?


11

给定存在类型

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

这个通用的Java接口:

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

存在类型和Java接口之间的根本区别是什么?

显然,在语法上存在差异,并且Java的面向对象(还包括诸如隐藏this参数等详细信息)。我对这些方面的兴趣不大,对概念和语义上的区别不那么感兴趣-尽管如果有人想阐明一些更好的观点(例如Tvs 之间的符号差异T<X>),也将不胜感激。


Answers:


4

嗯...这个定义看起来很像我很久以前见过的一些haskell示例。

{-# 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您提出的Java的主要区别在于您必须知道中间类型以将结果传递op₁op₂。也就是说,存在类型的正确系统应选择可以根据条件存在的正确类型。也就是说,您应该能够使用类型编写函数∀X. X→(X→boolean)→T。在一个先前采样这样的功能是X在构造函数中使用X 3 showshow是函数,它接受的任何类型的参数实现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-实际上是您的₁。

因此,我想我现在已经了解到,经典的OOP语言(Java,C#,C ++等)总是实现具有单个值的存在类型,this并且在其上存在一个称为“方法”的函数,该函数隐式地使用该值进行调用:)

PS:对不起,我对Java不太熟悉,但我希望您有这个主意。


我要补充一点,您将要查看Java 8中为函数式编程支持而引入的Single Abstract Method(SAM)类型。
马丁·维尔堡

2

唯一的区别是Java接口实际上对Java编译器有意义。

存在性类型是一种类型的形式定义,对任何语言都不特定。计算机科学家使用这种定义来证明有关类型和实现它的语言的事情。Java接口是Java正式定义类型的实现之一。


不。cf威廉纸上做饭。
nicolas 2014年

2

提出的2种类型彼此之间非常不同。您编写的接口定义是一种通用类型(通常,Java泛型属于此类)。

存在类型对使用者隐藏其实现中的类型。直观地讲,要使X在T中存在,就不能从任何消费者那里得知X的身份;所有应该知道的是定义时提供的操作集。对于某些类型X,存在一个类型T。

相反,通用类型定义了适用于所有类型的操作,消费者可以从中自由选择。接口类型T就是那个。X由使用者实例化,该使用者将确切地知道X是哪种类型。宇宙中每个X类型都有一个T类型。

存在性实际上并没有在Java中作为语言构造出现,除了在通配符(List<?>)的有限情况下。但是可以,它们可以通过接口进行仿真。这样,问题就会更多地涉及设计。

正如ony所指出的,在面向对象的设置中,存在性的实现变得很棘手,因为您通常对X的类型信息进行编码的方式(您可以对它进行处理)是在X实现的接口类型中包含成员函数。简而言之,接口可以购买某种类型的抽象功能,但在某种程度上需要消除存在性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.