基于通用接口的实现限制java中的泛型类型

Gol*_*ena 6 java generics

所以我有2个通用接口.

第一个接口是这样实现的.

public interface First<E>
{
   void method(E e)
}

public class FirstImpl implements First<String>
{
   void method(String s) { System.out.println(s); }
}

public class FirstImpl2 implements First<Double>
{
    void method(Double d) { System.out.println(d); }
}
Run Code Online (Sandbox Code Playgroud)

我还需要第二次接口的(第二界面如下图所示),泛型类型,只允许被实施第一界面的时候,在我们的例子中使用的类StringDouble.是否有任何干净的方法来做这件事,比如

public interface Second <E, ? extends First<E>>
{
    void method(E e);
}

public class SecondImpl <E> implements Second <E, ? extends First<E>>
{
    void method(E e) { System.out.println(e); }
}
Run Code Online (Sandbox Code Playgroud)

,所以在第二的通用E将只适合StringDouble所有被用来实现类First<E>

Erh*_*mir 1

没有。从这个意义上讲,您不能限制 Second 的泛型类型。您仍然可以独立提供另一种类型的信息。说,

class XYZ implements First<Bar> { ... }
Run Code Online (Sandbox Code Playgroud)

另一个类可以为第二个类提供另一种类型信息,例如

class ZYX implements Second<Foo, SomeOtherType<Foo>> { ... } 
Run Code Online (Sandbox Code Playgroud)

假设 SomeOtherType 实现/扩展了 First 类型的任何内容。如果您想将这两个接口绑定到它们的泛型类型上,您可以在实现之间使用继承:

  interface First<T> {}
  interface Second<T> {}
  class Foo<E extends T> implements First<T> {}
  class Bar<E extends T> extends Foo<E> implements Second<E> {}
Run Code Online (Sandbox Code Playgroud)

现在,类型 E 通过 E 扩展 T 与类型 T 关联。