我刚遇到一段代码:
public interface MyInterface<T extends MyInterface<T>> {...}
然后课程似乎如下:
public final class MyClass implements MyInterface<MyClass> {...}
接口没有定义,只有方法声明。我认为extends MyInterface<T>
是多余的,界面可以只是:
public interface MyInterface<T> {...}
成为Java的新手,是否有原始接口定义的目的(使用extends部分)?这是一种模式吗?
答案 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)
之类的方法。