如何在某些类的接口中限制Java泛型类型参数

时间:2016-09-02 07:47:27

标签: java generics types

我正在创建一个类型化接口定义,我想将type参数的可能值限制为一组类。这些类已经存在并且不受我的控制。此外,它们通过类层次结构彼此无关。

因此,例如,我有三个类A,B,C。我的界面是event_ids。 如何限制此接口的实现者并确保T仅为A,B或C? 非常感谢。

干杯,

马丁

3 个答案:

答案 0 :(得分:4)

如果ABC有一个共同的超级类型(让我们说它被称为Super),那么你可以做:

public interface IMyFancyInterface<T extends Super> { .. }

这样,您应始终使用类型参数实现此接口,该类型参数是Super的子类型,即ABC

但是,如果ABC没有共同的超类型,您可以创建标记界面(没有抽象方法的界面)并让他们实现它。例如:

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创建抽象类来创建一个变通方法。因此,不是实现接口,而是需要从这些抽象类之一派生其他访问者类。看起来有点冗长,但显然没有别的办法。