【发布时间】:2018-09-06 07:45:21
【问题描述】:
我有以下 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_1 或T_2
实体T_1 和T_2 之间没有业务关系,因此我不这样做:
public interface BaseT { ... }
public class T_1 implements BaseT { ... }
public class T_2 implements BaseT { ... }
public class MyClass<T extends BaseT>
如果它们不相关,为什么要使用泛型:
我正在为两者定义(尝试)一个通用类,因为即使它们明确地不相关,也存在隐式关系,因为T_1 和T_2 可以并且将出现与MyClass 中表示的实体相关联
T 对于 MyClass、AnotherClass 和 OtherClass 将是相同的,因此在一个实例中只会有 T_1 或 T_2,但绝不会同时出现两者。
我的问题是,除了设计一个
MyClass的接口并为T_1和T_2? 实现它。我可以实现类似
MyClass<T extends T_1 or T_2>的东西吗?
亲切的问候
【问题讨论】:
-
如果实际类型不相关,为什么要对两个类都使用泛型 T?
-
将其定义为
MyClass<T, U>甚至MyClass<T, U, V>有什么问题?这将允许您分别设置每种类型的边界。 -
哦,好的。所以基本上你追求的是
MyClass<T extends T1 or T2>? -
这被称为“联合类型”,我认为 Java 没有它们(
catch块除外)。您需要使用一些包装器来模拟它。 -
如果 T_1 和 T_2 是一个公共接口没有价值的分离,那么可能应该围绕 T_1 和 T_2 创建包装类,以公开当前存储在 MyClass、AnotherClass、OtherClass 中的公共功能.然后有一个通用的接口。恐怕目前类中会有instanceofs。
标签: java oop generics design-patterns