gpt4 book ai didi

java - 如何禁止 Java 列表中不同类的实例?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:39 29 4
gpt4 key购买 nike

假设我有方法 doSomething(List<A> list)我有抽象类 A和具体类(class) BC实现 A .

所以我想告诉客户传递 B 的列表C 的对象或列表对象,但我不想让他通过 3 B对象和 2 C一个列表中的对象。

一种解决方案是添加新参数“type”并检查所有实例是否属于同一类,但该解决方案对我来说似乎并不“优雅”。

如果我可以像 @SameConcreteClasses 这样的注释方法就好了或类似的东西,以便调用者可以看到我的期望。

最佳答案

这不是您应该在 Java 中使用继承的方式。

您的列表收集类类型 A 的项目。任何迭代该列表的对象都将确保类类型 A 的所有方法都可用,并以 A 中定义的类型的值响应。

如果您需要 B 类或 C 类中提供的方法,那么我建议您添加一个支持管道中所需方法的接口(interface),将其添加到您的类中,然后可以在管道中进一步访问使用它的任何方法,无论添加到 List<MyInterface> 的类的类型如何

您希望开发人员知道您期望/需要什么方法,这基本上也是接口(interface)的教科书定义。
这是您对 future 开发人员的提示:“我需要定义方法 a、b、c 和 z 以返回某类类型。我不关心您如何构建它,或者您是否模拟它,只要因为我可以使用这些方法。”
您可以放心,您的方法调用不会抛出错误,您可能只会偶尔返回 null。

首先考虑您的管道,以及它们需要哪些可用方法。
然后为这些方法编写一个接口(interface)。
然后将该接口(interface)添加到适用的类中。
然后使列表只接受具有该接口(interface)的项目。

class A {
protected int count = 1;
public int getCount() {
return this.count;
}
}
class B extends A{
private String name = "B";
public String getName(){
return this.name;
}
}
class C {
private String name = "C";
public int getCount() {
return 20;
}

public String getName(){
return this.name;
}
}

假设在收集了所有类的管道末尾,我们有一个方法:

public void outputFull(List<????> output) {
for(???? item : output) {
if(item.getCount() > 1) {
System.out.println(item.getName() + " has " + item.getCount() + " items");
}
}
}

我用 ??? 标记了类型因为我们“还不知道我们需要什么”

因此,从我们通过管道传递的 final方法中,我们知道我们需要具有 int getCount() 的对象和一个 String getName()方法。

我们可以为此编写一个接口(interface):

public interface INamedCountable {
public int getCount();
public String getName();
}

有了那个接口(interface),我们可以把我们想要的对象变成那个接口(interface)类型

class A {
protected int count = 1;
public int getCount() {
return this.count;
}
}
class B extends A implements INamedCountable {
private String name = "B";
public String getName(){
return this.name;
}
}
class C implements INamedCountable {
private String name = "C";
public int getCount() {
return 20;
}

public String getName(){
return this.name;
}
}

对于我们的管道,我们可以使用:

public void outputFull(List<INamedCountable> output) {
for(INamedCountable item : output) {
if(item.getCount() > 1) {
System.out.println(item.getName() + " has " + item.getCount() + " items");
}
}
}
public void runPipe() {
List<INamedCountable> pipeline = new ArrayList<INamedCountable>();
pipeline.add(new B());
pipeline.add(new C());
outputFull(pipeline);
}

关于java - 如何禁止 Java 列表中不同类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45859394/

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