鉴于界面:
public interface BasedOnOther> {
public T getOther();
public void staticStatisfied(final U list);
}
BasedOnOther< T,U extends BasedList< T>>在我的用例中看起来非常难看.这是因为T类型参数已经在基础列表< T>中定义.部分,所以“丑陋”来自T需要输入两次.
问题:是否可以让Java编译器从BasedList< T>中推断出通用T类型.在泛型类/接口定义中?
最终,我想使用如下界面:
class X implements BasedOnOther {
public SomeType getOther() { ... }
public void staticStatisfied(final Y list) { ... }
} // Does not compile, due to invalid parameter count.
其中Y扩展了BasedList< SomeType>.
代替:
class X implements BasedOnOther {
public SomeType getOther() { ... }
public void staticStatisfied(final Y list) { ... }
}
其中Y扩展了BasedList< SomeType>.
更新:ColinD建议
public interface BasedOnOther {
public T getOther();
public void staticSatisfied(BasedList list);
}
创建一个实现是不可能的,例如:
public class X implements BasedOnOther {
public SomeType getOther() { ... }
public void staticStatisfied(MemoryModel list);
} // Does not compile, as it does not implement the interface.
MemoryModel扩展了BasedList< SomeType>,这是必需的(因为它提供了其他方法).
解决方法:
看起来好像你实际上并不需要类型参数U extends BasedList< T>,如果你实际上不需要在类中做任何事情,需要一些特定的子类/基本列表< T>的实现.界面可能只是:
public interface BasedOnOther {
public T getOther();
public void staticSatisfied(BasedList list);
}
编辑:根据您的更新,我认为您无法做到这一点.我想你要么只需要使用原始声明,要么制作一些指定T的中间类型,例如:
public interface BasedOnSomeType>
extends BasedOnOther
{
}
public class X implements BasedOnSomeType { ... }
这看起来像是一种浪费,我并不认为原始声明看起来那么糟糕.
标签:java,type-inference,generics
来源: https://codeday.me/bug/20190621/1258165.html