给定接口:
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> { ... }
不过,这似乎是一种浪费,而且我真的不认为原始声明看起来很糟糕。