2

我想声明包含实现 2 个不同接口的类实例的属性。我试过这种语法:

private <? extends Interface1 & Interface2> name;

还有这个:

private <T extends Interface1 & Interface2> T name;

这些都不起作用。是否可以?语法是什么?我试图避免声明另一个继承自Interface1和的接口Interface2


编辑:

包含此属性的类不应有任何类型参数。那不是这样的:

public class MyClass<T extends Interface1 & Interface2>{
    private T name;
    ...
}

对于那些使用该类的人来说,这没有任何意义。预计该类是通用的既不合逻辑也不可能。

4

4 回答 4

4

这需要在类声明中进行,例如:

public class TestG<T extends Cloneable & Serializable> {
    private T name;
}

一种替代方法是将其设置在方法中(但不是变量)

public class TestG {
    public <T extends Cloneable & Serializable> void  method(T parameter) {
    }
}
于 2012-11-17T10:09:26.053 回答
2

class declaration您可以在您的, 或中声明该类型参数method declaration,如果那是 a local variable,则使用该类型:-

public class Demo<T extends Interface1 & Interface2> {
    private T t;
} 

或者: -

public class Demo {
    public <S extends Interface1 & Interface2> void demo(S param1) {
        S param;
    }
}
于 2012-11-17T10:10:12.793 回答
2

变量不能是泛型的。

private <T> T var;

不可能 - 在哪一点被T定义?访问时var,我无法对分配时使用的内容做出太多假设。

Java 允许在方法上使用泛型。所以你可以拥有

private <T implements Cloneable & Serializable> void setVar(T val);

你可以有一个类范围的类型T

但请始终记住,它最终是通过类型擦除实现的。您始终可以使用 getter、setter 和 cast 来模拟更复杂的逻辑。如果做得好,它会给你同样多的类型安全。

获得具有所需类型安全性的变量的最简单方法是仅使用两个变量和一个 setter 来使它们保持同步。

private Serializable vars;
private Cloneable vars;

当然会给你一个很好的类型安全。但是,是的,它需要 4 个字节的额外内存和一个 setter。

这是您询问的铸造方法:

private Object internal_var;

// Implementation notice: do not remove this generic.
// Due to a Java limitation, we *do* want these two constraints!
public <T extends Serializable & Cloneable> void setVar(T val) {
    internal_var = val;
}

public Serializable getSerializable() {
    return (Serializable) internal_var; // Type checked in setter!
}

public Cloneable getCloneable() {
    return (Cloneable) internal_var; // Type checked in setter!
}

// This is the way to use it in a generic getter:
public <T extends Serializable & Cloneable> T getVar(Class<? super T> cls) {
    return (T) cls.cast(val);
}

请注意,为了T在 getter 中使用,我们确实需要一个涉及 T 的参数。假设我们知道一个 class Example implements Serializable, Cloneable,我们可以使用

// This actually ensures we get an instance of `Example` out:
Example e = instance.getVar(Example.class);
于 2012-11-17T10:23:17.910 回答
1

如果我正确理解您的问题,您需要一个实现两个 inetrfaces 的通用类。在您的类定义中声明一个泛型类型参数并将其设为实例变量类型。

public class Implementor<T extends Interface1<T> & Interface2<T>>  {
    private T t;

}

编辑:

您不能在实例变量声明中声明类型参数,例如

 private <T extends I1 &I2> T t; //this cant be achieved. 

在方法级别虽然是可能的。

public <T extends I1 & I2> void method(T t){

  }
于 2012-11-17T10:08:37.133 回答