Java支持泛型类型和方法。为什么不是通用字段?

Java支持泛型类型和方法。为什么不是通用字段?,java,generics,Java,Generics,尽管Java没有泛型[@runtime],但最近我陷入了某种泛型地狱 情况(已删除简化和无用的上下文): 有一个库a,它提供了一个接口IA。有一个库B,它提供了接口IB。这两个库都是第三方库,我完全无法控制。 (事实上,有2个以上,但我们先不要让它变得太复杂。) 有一个由我的公司开发的引擎,它定义并大量使用同时实现IA和IB的对象。因为我们的引擎必须处理所有的实现,我们不能简单地定义一些接口IAB实现IA,IB,并让我们所有的类实现它。因此,为了获得编译时类型安全性和方法公开,决定使用泛型方法。

尽管Java没有泛型[@runtime],但最近我陷入了某种泛型地狱

情况(已删除简化和无用的上下文):

有一个库a,它提供了一个接口IA。有一个库B,它提供了接口IB。这两个库都是第三方库,我完全无法控制。 (事实上,有2个以上,但我们先不要让它变得太复杂。)

有一个由我的公司开发的引擎,它定义并大量使用同时实现IA和IB的对象。因为我们的引擎必须处理所有的实现,我们不能简单地定义一些接口IAB实现IA,IB,并让我们所有的类实现它。因此,为了获得编译时类型安全性和方法公开,决定使用泛型方法。因此,无论何时需要“IAB”,我们都会
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;//编译错误,因为类型不同。

创建一个通用包装器-类似于
供应商
并将其用作
最终供应商
。我现在理解了强加的限制。谢谢。这是可以接受的,但只有在通用是最终的或有效的最终的情况下。编写(或让其他人编写)此类“通用”的子类类型肯定会引起持久的噩梦:)