Java 我怎么能';集团';一起定制课程?

Java 我怎么能';集团';一起定制课程?,java,android,class,Java,Android,Class,我有一些自定义类,其中包含有关RecyclerView中不同视图类型的信息,如标题、说明等(尽管每个类都有不同的变量)。我想将这些类添加到ArrayList,但我不希望它是泛型(对象?ArrayList),我想确保只能放入自定义类。现在我可以用setter和getter为它创建另一个类,并进行一些检查,但我更喜欢像ArrayList,其中CustomGroup可以是CustomClass1,CustomClass2中的任何一个。。。这可能吗?如果可能,我将如何做 例如: public class

我有一些自定义类,其中包含有关
RecyclerView
中不同视图类型的信息,如标题、说明等(尽管每个类都有不同的变量)。我想将这些类添加到
ArrayList
,但我不希望它是泛型(对象?
ArrayList
),我想确保只能放入自定义类。现在我可以用setter和getter为它创建另一个类,并进行一些检查,但我更喜欢像
ArrayList
,其中
CustomGroup
可以是
CustomClass1
CustomClass2
中的任何一个。。。这可能吗?如果可能,我将如何做

例如:

public class CustomClass1 {
    String title, description;
    int amount;

    // Getter & Setter
}

public class CustomClass2 {
    String errorMessage;
    int errorCode;

    // Getter & Setter
}

public class CustomClass3 {
    String warningName;
    double amount;

    // Getter & Setter
}

ArrayList<CustomGroup> arrayList = new ArrayList<>();

CustomClass3 customClass3 = new CustomClass3();
// Set values for customClass3

arrayList.add(customClass3);

CustomClass1 customClass1 = new CustomClass1();
// Set values for customClass1

arrayList.add(customClass1);
公共类CustomClass1{
字符串标题、描述;
整数金额;
//吸气剂和塞特
}
公共类CustomClass2{
字符串错误消息;
国际误码;
//吸气剂和塞特
}
公共类CustomClass3{
字符串警告名称;
双倍金额;
//吸气剂和塞特
}
ArrayList ArrayList=新的ArrayList();
CustomClass3 CustomClass3=新CustomClass3();
//设置customClass3的值
arrayList.add(customClass3);
CustomClass1 CustomClass1=新CustomClass1();
//设置customClass1的值
arrayList.add(customClass1);

我建议为此使用一个接口。您可以将接口用作“标记”,其中接口基本上只定义了要在列表中实现它的类。但是,在您的示例中,可以让接口定义字符串和int属性

未指定任何内容的界面“标记”

public interface ICustomClassInterface {

}

public class CustomClass1 implements ICustomClassInterface {
    String title, description;
    int amount;
}

ArrayList<ICustomClassInterface> arrayList = new ArrayList<ICustomClassInterface>();
public interface ICustomClassInterface {
    String FieldA;
    int FieldB;
}

public CustomClass1 implements ICustomClassInterface {
    String FieldA;
    int FieldB;
}

ArrayList<ICustomClassInterface> arrayList = new ArrayList<ICustomClassInterface>();
公共接口ICustomClassInterface{
}
公共类CustomClass1实现ICustomClassInterface{
字符串标题、描述;
整数金额;
}
ArrayList ArrayList=新的ArrayList();
只有实现接口的类才能添加到列表中。然而,这里的问题是,您将通过这个接口访问它们,这个接口没有定义任何内容,即,您需要弄清楚它是什么类型的

理想情况下,您可以重构类,使其具有在抽象类中定义或在接口中指定的公共功能,这样您就不必关心实际类型是什么

定义了所需属性的接口

public interface ICustomClassInterface {

}

public class CustomClass1 implements ICustomClassInterface {
    String title, description;
    int amount;
}

ArrayList<ICustomClassInterface> arrayList = new ArrayList<ICustomClassInterface>();
public interface ICustomClassInterface {
    String FieldA;
    int FieldB;
}

public CustomClass1 implements ICustomClassInterface {
    String FieldA;
    int FieldB;
}

ArrayList<ICustomClassInterface> arrayList = new ArrayList<ICustomClassInterface>();
公共接口ICustomClassInterface{
弦场;
int FieldB;
}
public CustomClass1实现ICustomClassInterface{
弦场;
int FieldB;
}
ArrayList ArrayList=新的ArrayList();

您有几个完全不同的对象,需要将其与数组列表连接起来,以便按位置在recyclerView中显示。因此,您必须使用对象的ArrayList(或另一个对象集合),并且无法避免它和pospone检查类型。
您必须创建这样的列表,并使用instanceof将存储对象的具体类与item类型(在getItemType中)连接起来。之后,您可以根据这些类型创建视图保持架,然后在onBindViewHolder中将当前项目转换为连接的视图保持架或将转换封装在混凝土视图保持架中

我同意另一个建议使用界面的答案。我想补充一点,因为您展示的示例没有相同的类型,您会发现自己正在进行检查;也许像:

if (someClass instanceof CustomClass1) {
    ...
} else if (someClass instanceof CustomClass2) {
    ...
} else if (someClass instanceof CustomClassN) {
    ...
} else { ... }
这不是很容易扩展或维护的

您可以使用该接口,无论是空的还是具有相同类型的公共属性,但通过执行上述检查,它可能会变得丑陋。也许你可以避免的是添加一个
CustomClassProcessor
类,它将为你必须处理的各种类型提供重载方法;这称为访问者模式

public class CustomClassProcessor {

    public void process(CustomClass1 cc) {
        // Do stuff for CustomClass1
    }

    public void process(CustomClass2 cc) {
        // Do stuff for CustomClass2
    }

    public void process(CustomClass cc) {
        // Do stuff for CustomClass3
    }
    ...
}
您的界面如下所示:

public interface CustomClass {

    public void getProcessed(CustomClassProcessor cp);
}
具体自定义类的一个示例是:

public class CustomClass1 implements CustomClass {

    @Override
    public void getProcessed(CustomClassProcessor cp) {
        cp.process(this);
    }
}
你会像这样使用它:

for (CustomClass cc : list)
    cc.getProcessed(customClassProcessor);
或者使用Java8功能


list.forEach(cc->cc.getProcessed(customClassProcessor)

接口或它们都从中派生出来的公共基类是这里的解决方案。请注意,在他们的示例中并非所有的类都有
int
s;显示的一个类有
double
值。@ChiefTwoPencils是的-我认为由开发人员决定最适合这里。我认为作者需要具体项ob的所有字段对象,因此他将被迫检查类型并使用强制转换。无论它是基本接口的集合还是仅仅是对象。这看起来确实像我需要的一样,谢谢你的建议。关于确定它是什么类型,
if(arrayList.get(pos.getClass()==CustomClass1.class)
似乎工作得很好。现在我认为不应该太频繁地调用
getClass()
。这是一种可以接受的检查类型的方法吗?