我试图在java中创建两个相互包含的类之间的泛型关系.这些对象基本上形成一个alernating层树.到目前为止,我发现最接近的SO问题是:泛型的Java泛型,它对我的问题很接近并且有些帮助,但仍然不同,我想要额外的指导.这是情况,或者更确切地说,我希望它是什么:
abstract class Group<I extends Item<Group<I>>>{
private List<I> items;
public List<I> getItems(){...}
public void setItems(List<I> items){...}
}
abstract class Item<G extends Group<Item<G>>>{
private List<G> subGroups;
public List<G> getSubGroups(){...}
public void setSubGroups(List<G> subGroups){...}
}
Run Code Online (Sandbox Code Playgroud)
除了吸气剂和制定者之外,该类的某些方面使它们彼此明显不同,但包含应该遵循这样的方式.这背后的原因是我想强制执行,如果我有实现类,他们必须表现如下:
class AGroup extends Group<AItem>{...} //works
class AItem extends Item<AGroup>{...} //works
class BGroup extends Group<BItem>{...} //works
class BItem extends Item<BGroup>{...} //works
class MixedGroup extends Group<AItem>{...} //fails since AItem does
//not extend Item<MixedGroup>
Run Code Online (Sandbox Code Playgroud)
到目前为止,编译器很好用
abstract class Group<I extends Item<Group<I>>>{
private List<I> items;
public List<I> getItems(){...}
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一种类型来存储颜色十六进制,最好以字节形式存储。我按照 postgres 文档中的所有说明进行操作:http://www.postgresql.org/docs/9.3/static/sql-createtype.html
并发现它说的部分CREATE FUNCTION my_box_in_function(cstring) RETURNS box AS ... ;......令人不安。省略号里写什么?事实证明这是合理的,因为我找不到任何创建简单数据类型而不用 C 编写的自定义 PG 函数的示例。我最好的尝试是:
CREATE TYPE color;
CREATE FUNCTION color_in(cstring) RETURNS color AS $$
BEGIN
RETURN decode($1::text, 'hex')::color;
END;
$$ LANGUAGE PLPGSQL IMMUTABLE RETURNS NULL ON NULL INPUT;
CREATE FUNCTION color_out(color) RETURNS cstring AS $$
BEGIN
RETURN encode($1::bytea, 'hex')::text;
END;
$$ LANGUAGE PLPGSQL IMMUTABLE RETURNS NULL ON NULL INPUT;
CREATE TYPE color (
INTERNALLENGTH = 3,
LIKE = bytea,
INPUT = color_in,
OUTPUT = color_out
); …Run Code Online (Sandbox Code Playgroud)