我有以下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
或{{1} },但永远不会同时出现。
我的问题是,除了设计
T_2
的接口,并同时为MyClass
和T_1
实施?我可以达到
T_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