我正在创建一个类型化接口定义,我想将type参数的可能值限制为一组类。这些类已经存在并且不受我的控制。此外,它们通过类层次结构彼此无关。
因此,例如,我有三个类A,B,C。我的界面是event_ids
。
如何限制此接口的实现者并确保T仅为A,B或C?
非常感谢。
干杯,
马丁
答案 0 :(得分:4)
如果A
,B
和C
有一个共同的超级类型(让我们说它被称为Super
),那么你可以做:
public interface IMyFancyInterface<T extends Super> { .. }
这样,您应始终使用类型参数实现此接口,该类型参数是Super
的子类型,即A
,B
或C
。
但是,如果A
,B
和C
没有共同的超类型,您可以创建标记界面(没有抽象方法的界面)并让他们实现它。例如:
public interface Marker { }
public class A implements Marker { }
public class B implements Marker { }
public class C implements Marker { }
通过这种方式,您可以按照我最初建议的方法进行操作:
public interface IMyFancyInterface<T extends Marker> { .. }
答案 1 :(得分:3)
你做不到。如果可能,请考虑以下代码:
class MyClass implements IMyFancyInterface<T>
{
<T extends A | B | C> void DoSomething(T o)
{
// what should the parameter o behave like?
// o.???
}
}
如果只有少数A / B / C实现,您可以使用非泛型方法:
interface MyFancyInterface
{
void DoA(A a);
void DoB(B b);
void DoC(C c);
}
或投射一种方法:
interface MyFancyInterface
{
void Do(Object o);
}
class MyClass implements MyFancyInterface
{
public void Do(Object o)
{
if (o instanceof A)
{
//do something with A
}
else if ...
}
}
答案 2 :(得分:0)
我现在通过为实现接口的三个类A,B,C创建抽象类来创建一个变通方法。因此,不是实现接口,而是需要从这些抽象类之一派生其他访问者类。看起来有点冗长,但显然没有别的办法。