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

时间:2018-09-06 07:45:22

标签: java oop generics design-patterns

我有以下Java泛型问题

我有以下通用类,可以概括为:

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

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

对于类MyClass<T>而言(截至目前)确切的类型T并不重要,但对于两者:

  • AnotherClass<T>

  • OtherClass<T>

绝对关键是通用类型,并且将在运行时以此为基础做出决定。

基于此,类型T并非完全任意,它可以是类T_1的层次结构的实例,也可以是类T_2的层次结构的实例。

根据类的定义,类型T等效于Object,但我知道它等效于T_1T_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对于MyClassAnotherClassOtherClass将是相同的,因此在一个实例中将仅存在T_1或{{1} },但永远不会同时出现。

  

我的问题是,除了设计   T_2的接口,并同时为MyClassT_1实施?

     

我可以达到T_2之类的东西吗?

亲切的问候

2 个答案:

答案 0 :(得分:2)

可能这并不是您想要的,但是您可以尝试一下:

创建一个实现所有内容的abstract通用类:

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

  // Add any code needed

}

然后为两个基类创建2个泛型类。
如果所有代码都可以抽象形式实现,则这些类可能为空:

public class MyT1Class<T extends T_1> extends MyClass<T>
{
}

public class MyT2Class<T extends T_2> extends MyClass<T>
{
}

答案 1 :(得分:0)

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

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