我想知道Java中是否存在使用always" extends"而不是" implements"来定义类型参数边界的特殊原因.
例:
public interface C {}
public class A<B implements C>{}
Run Code Online (Sandbox Code Playgroud)
被禁止但是
public class A<B extends C>{}
Run Code Online (Sandbox Code Playgroud)
是正确的.这是什么原因?
像往常一样,问题是在数据库中显示有向非循环图.我拥有的数据库的选择是关系数据库,如mysql或mongodb.我之所以选择mongoDb是因为关系数据库中的 DAG是一团糟,但如果有一个技巧我就是找不到请告诉我.
目标是在一个或多个MongoDB文档中映射DAG.因为我们有多个孩子和父母SubDocuments,没有可能.我遇到了多种设计模式,但我不确定哪种模式最适合.
祖先阵列是由mongoDB文档建议的.而且很容易理解.据我了解,我的文档看起来像这样:
{
"_id" : "root",
"ancestors" : [ null ],
"left": 1
}
{
"_id" : "child1",
"ancestors" : [ "root" ],
"left": 2
}
{
"_id" : "child2",
"ancestors" : [ "root", "child1" ],
"left": 1
}
Run Code Online (Sandbox Code Playgroud)
这允许我find像这样的元素的所有孩子:
db.Tree.find({ancestors: 'root'}).sort({left: -1})
Run Code Online (Sandbox Code Playgroud)
所有的父母都这样:
db.Tree.findOne({_id: 'child1'}).ancestors
Run Code Online (Sandbox Code Playgroud)
我的第二种方法是用 s 替换字符串键DBRef.但是除了更长的数据库记录,我没有看到比祖先数组更多的优点.
children …fmap也是<$>因为它是函数$类中的函数application().
(+5) $ (*10) $ 10 -- 105
(+5) <$> (*10) <$> [1,2,3] -- [15,25,35]
Run Code Online (Sandbox Code Playgroud)
然后我想,在这种情况下<*>,应用程序仿函数类别中的函数应用程序,这应该工作:
[(+5), (+10)] <*> [(*10), (*100)] <*> [1,2,3] -- ERROR
-- however:
[(+5), (+10)] <*> ([(*10), (*100)] <*> [1,2,3]) -- [15,25,35,...]
Run Code Online (Sandbox Code Playgroud)
因此,<$>只有因为fmap函数恰好是后期合成才会成功,因此(+5) <$> (*10)将(+5) . (*10)其应用于[1,2,3].
然而,对于所有应用程序运算符(<<=包括)而言,左边的关联性在我看来似乎是一个糟糕的设计选择,特别是在他们认识到$已经是正确关联的相似性之后.还有其他原因吗?