当前位置: 首页 > 知识库问答 >
问题:

具有两个类层次结构的泛型类

姬和歌
2023-03-14

我有以下Java问题

我有以下通用类,它们可能被描绘为:

public class MyClass<T> {
    AnotherClass<T> another;
    OtherClass<T> other;
    ...
}

其中 表示与案例无关的代码。

对于类MyClass

>

  • 另一个类

    其他类

    泛型类型是什么是绝对重要的,在运行时将在此基础上做出决策。

    基于此,类型T不是完全任意的,它可以是类的层次结构T\u 1的实例,也可以是类的层次结构T\u 2

    根据类的定义,类型T相当于Object,但我知道它相当于T\u 1T\u 2

    实体T_1T_2之间没有业务关系,因此我不做:

    public interface BaseT { ... }
    public class T_1 implements BaseT { ... }
    public class T_2 implements BaseT { ... }
    
    public class MyClass<T extends BaseT>
    

    如果它们不相关,为什么要使用泛型的澄清:

    我正在为这两个类定义(试图)一个泛型类,因为即使它们显式地不相关,也存在一个隐式关系,因为T_1T_2都可以并且将与MyClass中表示的实体相关联

    T对于MyClassOtherClassOtherClass将是相同的,因此在一个实例中,只有T\u 1T\u 2,但决不能同时存在。

    我的问题是,除了为MyClass设计一个接口并为T_1T_2实现它之外,我还有哪些选择?。

    我可以实现像MyClass这样的功能吗

    问候


  • 共有2个答案

    闻飞跃
    2023-03-14

    我知道这不是一个很好的答案,但我不能把它作为对问题的评论
    您可以通过尝试以下操作在运行时检查类型:

    public class MyClass<T>
    {
      // This factory-method creates an instance of the class if the correct type is passed
      // It throws a RuntimeException if not.
      public static <T> MyClass<T> getInstance(Class<T> type)
      {
        if (T_1.class.isAssignableFrom(type) || T_2.class.isAssignableFrom(type))
          return (new MyClass<T>());
        else
          throw new RuntimeException("Cannot create instance of MyClass<" + type.getName() + ">");
      }
    
      ...
    
    }
    

    然后呢

    class T_3 extends T_2
    {
    }
    
    ....
    
    MyClass<T_3> test_1;
    test_1 = MyClass.getInstance(T_3.class); // This will succeed
    
    MyClass<String> test_2;
    test_2 = MyClass.getInstance(String.class); // Fails
    
    拓拔骁
    2023-03-14

    也许,这并不完全是您想要的,但您可以尝试一下:

    创建一个实现所有内容的抽象泛型类:

    public abstract class MyClass<T>
    {
      AnotherClass<T> another;
      OtherClass<T> other;
    
      // Add any code needed
    
    }
    

    然后为两个基类创建两个泛型类。
    如果所有代码都可以在抽象类中实现,这些类可能是空的:

    public class MyT1Class<T extends T_1> extends MyClass<T>
    {
    }
    
    public class MyT2Class<T extends T_2> extends MyClass<T>
    {
    }
    
     类似资料:
    • 问题是: 创建一个名为Duo的泛型类,它有两个参数a和B。声明一个名为a类型的第一个变量,以及一个名为B类型的第二个变量。创建一个接受这两个参数的构造函数。在构造函数中,将这些参数分别分配给声明的变量。 这是我能想到的解决方案: 然后,当我继续问下一个问题时,我被绊住了。问题是: 使用问题4中的Duo类声明并创建两个对象,如下所示: a) 第一个名为sideShape的对象分别由字符串类型和整数类

    • 据我解释,可以用任何表示,其中是或的超级类。同样的逻辑适用于也是。那么是?

    • 我在注释中创建一些元数据结构时遇到了问题。我们使用注释来定义Hibernate实体属性的特殊属性,但它可能在任何地方都可以使用。我想创建表示这些结构的条件: 问题是我需要使用此注释定义一些“树”结构。这是我想达到的一些设计: 我想根据这个例子使用的所有这些注释: 我知道我在上面的注释定义中定义的那种继承是不可能的。但是,我该如何考虑我的注释和,或是在一个“家庭”中?

    • 问题内容: 所以我有一张地图: 我会像这样添加元素: 我有如下通用方法: 现在,这段代码可以很好地工作,并且没有编译器问题: 但是,当我尝试这样做时: 编译器向我显示以下警告:类型安全:通用方法verifyType(String,Class)的未经检查的调用verifyType(String,Class) 这让我感到困惑…请帮助… 问题答案: 更改: 至 通过仅将类型声明为“ Class”,就失去

    • 我正在处理一个需求。当前有一个搜索页面,其中包含值(示例数据)1)Employee和2)Sport Person的列表框。 对象层次结构(Hibernate Bean)Person是实际对象,它具有两个不同的类1)Employee和2)基于Sports Person的鉴别器列 Person_Type(鉴别器列)。 在搜索页面上,如果用户选择任何一个列表框,将从该子类中得到数据。 现在的要求是同时显

    • 问题内容: 我有课: 然后创建对象: 尝试获取所有字段后,我打电话 但是我只有一个数组 如何从所有类的所有字段包括扩展? 问题答案: 请尝试以下操作: