“public interface MyInterface <t extends =”“myinterface <t =”“>&gt; {...}”的含义

时间:2018-06-01 10:39:36

标签: java oop

我刚遇到一段代码:

public interface MyInterface<T extends MyInterface<T>> {...}

然后课程似乎如下:

public final class MyClass implements MyInterface<MyClass> {...}

接口没有定义,只有方法声明。我认为extends MyInterface<T>是多余的,界面可以只是:

public interface MyInterface<T> {...}

成为Java的新手,是否有原始接口定义的目的(使用extends部分)?这是一种模式吗?

1 个答案:

答案 0 :(得分:1)

  

接口没有定义,只有方法声明。我认为扩展MyInterface是多余的......

不,不是。该边界确保只接受实现此接口的类。我们来看看界面:

<强> SomeInterface.java

public interface SomeInterface<T extends SomeInterface<T>>
{
  public T getInterfaceImpl();

  public void setTitle(String text);
}

和两个不同的实现类:

<强> SomeInterfaceImpl.java:

public class SomeInterfaceImpl implements SomeInterface<SomeInterfaceImpl>
{
  private String title;    

  @Override
  public SomeInterfaceImpl getInterfaceImpl()
  {
    return new SomeInterfaceImpl();
  }

  @Override
  public void setTitle( String text )
  {
    this.title = text;
  }
}

AnotherSomeInterfaceImpl.java:

public class AnotherSomeInterfaceImpl implements SomeInterface<SomeInterfaceImpl>
{
  private String title;

  @Override
  public SomeInterfaceImpl getInterfaceImpl()
  {
    return new SomeInterfaceImpl();
  }

  @Override
  public void setTitle( String text )
  {
    this.title = text;
  }
}

仔细查看两种实现中的方法签名。两个类都使用相同的类型参数扩展相同的接口,该参数以相同的方式定义方法的签名。想象一下,省略界面扩展中的界限。突然,一个实现类看起来像这样:

public class AnotherSomeInterfaceImpl implements SomeInterface<String>
{

  private String title;

  @Override
  public String getInterfaceImpl()
  {
    return "Hello World";
  }

  @Override
  public void setTitle( String text )
  {
    this.title = text;
  }
}

现在我们不再确信public T getInterfaceImpl()的返回对象是SomeInterface的实现,或者它有public void setTitle(String text)之类的方法。