C++概念和Java接口有什么区别?

9

我已经阅读了一些关于将在C++14/17中引入的概念的内容。据我所知,我们可以像这样定义和使用概念:

// Define the concept (from wikipedia)
auto concept less_comparable<typename T> {
    bool operator<(T);
}

// A class which implements the requirements of less_comparable,
// with T=`const string &`
class mystring
{
    bool operator < (const mystring & str) {
        // ...
    }
};

// Now, a class that requires less_comparable
template <less_comparable T>
class my_sorted_vector
{
    // ...
};

// And use my_sorted_vector
my_sorted_vector<int> v1;                  // should be fine
my_sorted_vector<mystring> v2;             // same
my_sorted_vector<struct sockaddr> v3;      // must give error?

我的问题是,这个概念在概念上基本上与Java接口相同吗?如果不是,它们有什么不同之处?
谢谢。

你应该意识到,概念和继承完全没有任何关系,一点关系都没有。而且Java接口是弱类型的,而概念则是非常强类型的。 - Puppy
@FredOverflow 如果不使用概念,也可以实现类似概念的效果。如果模板参数与代码中的使用不兼容,则代码目前将无法编译(尽管会出现令人困惑的错误消息)。 - Jason C
@DeadMG 是的,我知道。我已经删除了我的评论。它太过激动了。抱歉。 - Jason C
2个回答

12

Java接口定义类型。例如,您可以拥有一个Comparable<String>类型的变量。C++概念不定义类型。您不能拥有一个less_comparable<string>类型的变量。

概念像类型一样对类型进行分类。概念比类型高一个层级。在其他编程语言中,概念有不同的名称,如“元类型”或“类型类”。


2
+1 表示“概念分类类型,就像类型分类值一样”。 - Christian Hackl
1
如果说有什么类似的概念,那就是 Java 中泛型的 extends 约束,或者至少意图相似。 - Jason C
这是否意味着无法编写这样的函数:public bool someFunc(less_comparable<int> a, less_comparable<int> b){return a < b;} 不要太认真考虑该方法的有用性。 - Javier Mr
1
@JavierMr template<less_comparable T> bool someFunc(T a, T b) { return a < b; } - fredoverflow
@FredOverflow 但是你建议的是两个参数具有相同的类型T,而我试图定义的是一个函数,它接受可能具有不同类型的两个对象,只要它们可以作为整数进行比较。也许可以这样写:template<less_comparable T, less_comparable R> bool someFunc(T a, R b) { return a < b; } - Javier Mr

0
Java接口需要继承关系。概念更像鸭子类型,任何提供所需运算符/成员的对象都与它兼容。

我不是Java程序员,但我的理解是在Java中接口和继承是不同的(关键字implementsextends)。例如,一个Java类可以实现任意数量的接口,但Java只允许单一继承。 - Praxeolitic
Java只允许单一实现继承(extends),以避免基类冲突的“菱形问题”。接口仍然使用继承,但它们仅限于隐式抽象成员方法(最近通过默认方法放宽了限制),并且不能包含成员字段(菱形问题:每个对象存在多少个此状态的副本,哪一个是有效的?)。除了这个一对多的限制外,语言处理两者都是相同的。 - josefx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接