给定接口:

public interface BasedOnOther<T, U extends BasedList<T>> {

    public T getOther();

    public void staticStatisfied(final U list);

}

在我的用例中,BasedOnOther<T, U extends BasedList<T>>看起来非常难看。这是因为T部分中已经定义了BasedList<T>类型参数,因此“丑陋”来自于T需要键入两次。

问题:是否可以让Java编译器从通用类/接口定义中的T推断通用BasedList<T>类型?

最终,我想使用如下界面:
class X implements BasedOnOther<Y> {
    public SomeType getOther() { ... }
    public void staticStatisfied(final Y list) { ... }
} // Does not compile, due to invalid parameter count.

其中Y extends BasedList<SomeType>

代替:
class X implements BasedOnOther<SomeType, Y> {
    public SomeType getOther() { ... }
    public void staticStatisfied(final Y list) { ... }
}

其中Y extends BasedList<SomeType>

更新:建议使用ColinD
public interface BasedOnOther<T> {
    public T getOther();
    public void staticSatisfied(BasedList<T> list);
}

无法创建实现,例如:
public class X implements BasedOnOther<SomeType> {
    public SomeType getOther() { ... }
    public void staticStatisfied(MemoryModel list);
} // Does not compile, as it does not implement the interface.

需要MemoryModel extends BasedList<SomeType>的地方(因为它提供了其他方法)。

最佳答案

看起来,如果您实际上不需要在需要U extends BasedList<T>的某些特定子类/实现的类中执行任何操作,就好像您实际上不需要类型参数BasedList<T>。该接口可能是:

public interface BasedOnOther<T> {
  public T getOther();
  public void staticSatisfied(BasedList<T> list);
}

编辑:根据您的更新,我认为您没有任何方法可以执行此操作。我认为您要么只需要使用原始声明,要么创建一些指定T的中间类型,例如:
public interface BasedOnSomeType<U extends BasedList<SomeType>>
         extends BasedOnOther<SomeType, U>
{
}

public class X implements BasedOnSomeType<MemoryModel> { ... }

不过,这似乎是一种浪费,而且我真的不认为原始声明看起来很糟糕。

08-03 22:11