如何有一个类型引用来引用实现一组接口的任何对象?
例如,我可以具有如下的泛型类型:
Java:
public class Foo<T extends A & B> { }C#
public class Foo<T> where T : A, B { }这就是如何拥有一个类范围的泛型类型。但是,我只想拥有一个数据成员,它引用任何扩展给定接口集的对象。
示例:
public class Foo
{
protected <? extends A, B> object;
public void setObject(<? extends A, B> object)
{
this.object = object;
}
}如果有这种类型的语法是可能的,我怎样才能同时使用Java和C#呢?
我意识到我可以创建另一个接口来扩展所有想要的接口。但是,我并不认为这是最优的,因为它不必要地添加了另一种类型,其唯一目的是绕过语法。当然,这是一个很小的问题,但就优雅而言,这有点令人讨厌。
发布于 2011-11-14 01:10:17
在C#中,可以使用元组将值存储在某种中。
public class Foo {
private Tuple<IA, IB> junction;
public void SetValue<T>(T value) where T : IA, IB {
junction = Tuple.Create<IA, IB>(value, value);
}
}还可以有一个特殊类来强制执行两个值都引用同一个对象的约束:
public class Junction {
public IA A { get; private set; }
public IB B { get; private set; }
private Junction() { }
public static Junction Create<T>(T value) where T: IA, IB {
return new Junction {
A = value,
B = value
};
}
}
public class Foo {
private Junction junction;
public void SetValue<T>(T value) where T : IA, IB {
junction = Junction.Create(value);
}
}在Java中,通配符可以简化一些事情
class Junction<E extends A & B> {
private final E value;
public Junction(E value) {
this.value = value;
}
public E getValue() {
return value;
}
}
class Foo {
private Junction<?> junction;
public <E extends A & B> void setValue(E value) {
junction = new Junction<E>(value);
}
}或者您可以有相同值的别名(C#,但也适用于Java):
public class Foo {
private IA a;
private IB b;
public void SetValue<T>(T value) where T : IA, IB {
a = value;
b = value;
}
}发布于 2011-11-13 22:19:59
我的Java在长达两年的无活动状态下变得有点生疏了。
下面是我的C#方法:(完整的工作示例请参见https://ideone.com/N20xU )
public class Foo
{
private IInterface1 _object; // just pick one
public void setObject<T>(T obj)
where T : IInterface1, IComparable<T>, IEtcetera
{
// you now *know* that object supports all the interfaces
// you don't need the compiler to remind you
_object = obj;
}
public void ExerciseObject()
{
// completely safe due to the constraints on setObject<T>
IEtcetera itf = (IEtcetera) _object;
// ....
}发布于 2011-11-13 22:30:40
据我所知,您不能创建带有约束的变量,只能创建给定类型的变量。类型具有约束。这意味着您必须定义一个具有所需约束的类型,然后使用该类型创建变量。
这在我看来是合乎逻辑的,我也不明白为什么你要为你需要的东西定义一个类型是“令人讨厌的”。
https://stackoverflow.com/questions/8115191
复制相似问题