someclass的含义<vh extended =“” ??? =“”>

时间:2018-09-19 13:52:50

标签: android firebase

我知道JAVA的通用概念=类型 和Android的Recycler View概念。

我已经知道了->扩展了RecyclerView.Adapter。在Android开发者网站上看到过。

但是,这仍然很难理解。

我正在查看Firebase的Cloud Firestore代码。

还有一些代码...

extends FirestoreAdapter<SomeClassAdapter.ViewHolder>

public abstract class FirestoreAdapter<VH extends RecyclerView.ViewHolder>
extends RecyclerView.Adapter<VH>

这些概念对我来说太难了... 一些泛型和一些扩展。

我已经做了很多搜索,并且已经做了很多思考。请您简单解释一下?或一些要引用的网站。

感谢您的阅读!任何种类的小费都无所谓。我会感激的!

2 个答案:

答案 0 :(得分:0)

如果我用一个例子解释一下,也许会更容易理解:

假设我们有一个名为SomeClassAdapter的适配器类,它有一个名为ItemViewHolder的内部类,如下所示:

public class SomeClassAdapter extends FirestoreAdapter {
    ...
    private class ItemViewHolder extends FirestoreAdapter.ViewHolder {
    ...
    }
}

如果我们想使用内部类(SomeClassAdapter)作为视图持有者来扩展ItemViewHolder,我们将使用:

public class Example extends FirestoreAdapter<SomeClassAdapter.ItemViewHolder>

但是您提到的第二个概念是我们在示例中扩展的超类(它是抽象的,我们必须对其进行扩展并覆盖其抽象方法才能创建实例)

现在假设我们有一个类,该类需要一种类型才能在类声明中使用它。在这种情况下,我们声明一个类似FirestoreAdapter的类,并在<..>内部传递通用类型,例如:FirestoreAdapter<VH>。如果我们需要VH是另一个类似RecyclerView.ViewHolder的类的子类型,我们将其声明为:FirestoreAdapter<VH extends RecyclerView.ViewHolder>

如果我们需要FirestoreAdapter本身成为另一个类的子类型,例如RecyclerView.Adapter怎么办?因此它将是FirestoreAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter。在我们的示例中,RecyclerView.Adapter类需要一个扩展了RecyclerView.ViewHolder本身的泛型类型,我们想使用与FirestoreAdapter<VH>相同的类型,因此我们只需将VH作为泛型传递输入RecyclerView.Adapter。得出一个结论,我们将得到:

FirestoreAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH>

答案 1 :(得分:0)

即时翻译。

转换为人类语言,我们得到了这一点,通用 FirestoreAdapter 只会排除参数化类型的 ViewHolder 或其子类。最后它会从它的超类继承所有可用的字段,它是通用类 RecyclerView.Adapter

  • 证明和文件如下。

< VH 扩展 RecyclerView.ViewHolder >

为什么要使用有界类型参数?

  • 文档说明:
<块引用>

有时您可能希望限制可用作参数化类型中的类型参数的类型。

  • 在我们继续之前,重要的是我们定义类型类型参数参数化类型

什么是类型参数?

<块引用>

许多开发人员交替使用术语“类型参数”和“类型参数”,但这些术语并不相同。编码时,提供类型参数以创建参数化类型。

  • 然后我们可以将此定义映射到我们的代码,以了解我们自己的 CustomAdapter.ViewHolder 作为类型参数。现在我们可以继续前进了。

什么是参数化类型?

<块引用>

我们可以将参数化类型视为我们的类型参数的正式实例化要实例化这个类,像往常一样使用 new 关键字,但放在类名和括号之间: Box integerBox = new Box();

< VH extends RecyclerView.ViewHolder > 在做什么?

<块引用>

要声明有界类型参数,请列出类型参数的名称,然后是 extends 关键字,然后是其上限

  • 现在类型参数就是尖括号<>内的任何东西。 Source

  • 话虽如此,我们可以得出结论,VH 只不过是一个类型参数,扩展 RecyclerView.ViewHolder 是说我们的泛型类只接受 ViewHolder 对象或其子类。

结论

公共抽象类 FirestoreAdapter 扩展 RecyclerView.Adapter

  • 转换为,泛型 FirestoreAdapter 只会排除 ViewHolder 或其子类的参数化类型。最后,它将继承其超类的所有可用字段,即通用类 RecyclerView.Adapter