如何引用泛型类型参数的泛型类型参数?

3

实体接口:

public interface Entity<Id>
{
    Id getId();
}

还有道:

public interface Dao<T extends Entity<Id>, Id>
{
    T find(Id id);
}

如果我尝试在Dao(Id)上删除第二个类型参数,则会出现“无法将Id解析为类型”的错误。我的问题是,如果有可能消除Dao上的第二个类型参数,因为它实际上是多余的。
明确一下,我试图避免在使用Dao的任何地方重复 Id 类型。在实体接口中指定该类型应该足够。
现在,我必须像这样重复自己:
private Dao<Car, UUID> carDb;

我在使用Car Dao的任何地方。


鉴于接口根本没有提到T,删除T比删除Id更好,你是不是想让find方法返回T - Jon Skeet
我希望使用Dao的人被迫将Dao作为实体类的类型参数,例如Car(实现Entity)。仅有Entity而没有T会导致“在标记上的语法错误,构造放错位置”。 - jontejj
你说得对,find方法应该返回T,这样可以正常工作。问题已经修改。 - jontejj
正如所写,它完全不冗余。 - Raedwald
编辑了问题,这样你就能看到哪些是多余的。 - jontejj
1个回答

1

这是不可能的。

Dao<T extends Entity<Id>, Id> 中,第二个类型参数 Id 并不是多余的,因为 Dao 是基于两个类型参数进行参数化的,一个有界类型 T 和另一个 Id,此外,Entity 也是基于 Id 进行参数化的。(请注意,通过这样做,你限制了 Entity 的类型参数必须与 Dao 的第二个类型参数相同)

只有在编译器已经知道 Entity 的类型参数的情况下才可能实现。

interface Dao<T extends Entity<String>> {
    T find(String id);
}

这正是我所怀疑的。我会再把问题保持开放一段时间,以防有人提出其他的解决方案。 - jontejj

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