gpt4 book ai didi

另一个泛型的 Java 泛型

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:30:20 25 4
gpt4 key购买 nike

我有界面:

interface Identifable<T extends Serializable> {
T getID();
}

和实现它的类:

public class Cat implements Identifable<Long> {
public Long getID(){...};
}

一切正常。迄今为止。现在我想创建 GenericDAO,为什么我不能创建它?:

public abstract GenericDAO<T extends Identifable<S>> {
T getByID(S id);
}

我只能这样声明我的 GenericDAO:

public abstract GenericDAO<T extends Identifable, S> {
T getById(S id);
}

并完成类(class):

public CatDAO extends GenericDAO<Cat, Long> {
Cat getById(Long id);
}

但是我觉得没用,因为我重复了信息。我已经声明,Cat 实现了 Identifable< Long >,那么为什么我必须声明 GenericDAO< Cat, Long >,而不仅仅是 GenericDAO< Cat >?

最佳答案

在 Java 中,必须指定每个泛型类型。您可以不指定任何类型,但不能只指定一个。

此外,必须在声明中指定每个 通用类型。如果你想要 class GenericDAO<T extends Identifable<U>> , 您必须为 U 添加通用类型声明像这样对你的类声明(因为 U 这里实际上是一个通用类型):

public abstract class GenericDAO<T extends Identifable<U>, U> 

以下内容部分偏离主题,但您可能会发现它很有用。

我注意到在您对 GenericDAO 的定义中两个通用类型彼此不相关。这可能不是您想要的。

这里是两个泛型匹配的特殊情况(LongCat 定义中的 CatDAO 类型)。考虑拥有这些声明:

public class Dog implements Identifable<Long>
public class DogDAO extends GenericDao<Dog, String>

这将迫使您编写 getById DogDAO 中的方法方法:

Dog getById(String id);

你的 getId Dog 中的方法返回 Long所以你的getById方法 int DogDAO必须比较String s 至 Long秒。这是正确的做法,但有点违反直觉。有一个getById DogDAO 的方法这需要 Long参数更有意义,因为 Dog s ID 实际上是 Long

如果你想把这两种类型联系在一起,你可以定义 GenericDAO分类为:

public abstract class GenericDAO<T extends Identifable<S>, S>

您仍然必须指定第二个参数,但至少编译器可以帮助您确保类型匹配。

关于另一个泛型的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20677077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com