Java支持泛型类型和方法。为什么不是通用字段?
尽管Java没有泛型[@runtime],但最近我陷入了某种泛型地狱 情况(已删除简化和无用的上下文): 有一个库a,它提供了一个接口IA。有一个库B,它提供了接口IB。这两个库都是第三方库,我完全无法控制。 (事实上,有2个以上,但我们先不要让它变得太复杂。) 有一个由我的公司开发的引擎,它定义并大量使用同时实现IA和IB的对象。因为我们的引擎必须处理所有的实现,我们不能简单地定义一些接口IAB实现IA,IB,并让我们所有的类实现它。因此,为了获得编译时类型安全性和方法公开,决定使用泛型方法。因此,无论何时需要“IAB”,我们都会Java支持泛型类型和方法。为什么不是通用字段?,java,generics,Java,Generics,尽管Java没有泛型[@runtime],但最近我陷入了某种泛型地狱 情况(已删除简化和无用的上下文): 有一个库a,它提供了一个接口IA。有一个库B,它提供了接口IB。这两个库都是第三方库,我完全无法控制。 (事实上,有2个以上,但我们先不要让它变得太复杂。) 有一个由我的公司开发的引擎,它定义并大量使用同时实现IA和IB的对象。因为我们的引擎必须处理所有的实现,我们不能简单地定义一些接口IAB实现IA,IB,并让我们所有的类实现它。因此,为了获得编译时类型安全性和方法公开,决定使用泛型方法。
void doThis(IAB someObjectWithBothAPIs)
事实上,这很有效。然而,不可能用这两种形状做像IAB字段这样简单的事情代码>(无论是IA&IB字段还是hapis;
)。这就引出了一个问题:
为什么不呢?
基本上,当实例字段被限制为具体的类型时,允许任意TypeParams(opt)
(设计级别?)的原因是什么
JLS§8.3
FieldDeclaration:
FieldModifiers(opt) Type VariableDeclarators ;
JLS§8.4
MethodDeclaration:
MethodHeader MethodBody
MethodHeader:
MethodModifiers(opt) TypeParameters(opt) Result MethodDeclarator Throws(opt)
泛型方法在运行时从其调用上下文接收其类型参数。它可以在不同的情况下接收不同的类型
泛型字段如何接收类型参数?根据字段在某些上下文中的使用情况,字段不能具有不同的类型。它必须有一个在编译时已知的单一类型。您可以这样做,只是不在声明行中
interface IA {}
interface IB {}
interface IC {}
class Generic<IAB extends IA & IB> {
final IAB iab;
Generic(IAB iab) {
this.iab = iab;
}
<IBC extends IB & IC> void method(IBC arg) {
IBC ibc = arg;
}
}
接口IA{}
接口IB{}
接口IC{}
类泛型{
最终IAB;
通用(IAB-IAB){
this.iab=iab;
}
无效方法(IBC参数){
IBC IBC=arg;
}
}
避免在每一行上这样做的一个很好的理由是,扩展同一事物的两种类型可能不相同
例如,您可以编写的图像
class Generic {
<IAB extends IA & IB> IAB iab;
<IBA extends IA & IB> IBA iba;
<IAB extends IA & IB> void method(IAB arg) {
iab = arg; // error, types are not the same.
iba = iab; // compile error as the types are not the same.
类泛型{
IAB-IAB;
IBA;
无效方法(IAB参数){
iab=arg;//错误,类型不同。
iba=iab;//编译错误,因为类型不同。
与此相同,语法正确且不可编译
class Generic<IAB extends IA & IB, IBA extends IA & IB> {
IAB iab;
IBA iba;
<IAB extends IA & IB> void method(IAB arg) {
iab = arg; // error, types are not the same.
iba = iab; // compile error as the types are not the same.
类泛型{
IAB-IAB;
IBA;
无效方法(IAB参数){
iab=arg;//错误,类型不同。
iba=iab;//编译错误,因为类型不同。
创建一个通用包装器-类似于供应商
并将其用作最终供应商
。我现在理解了强加的限制。谢谢。这是可以接受的,但只有在通用是最终的或有效的最终的情况下。编写(或让其他人编写)此类“通用”的子类类型肯定会引起持久的噩梦:)