作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
给定界面:
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>
输入在通用类/接口(interface)定义中?
最终,我想使用如下界面:
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> { ... }
虽然这看起来有点浪费,而且我真的不认为原始声明看起来那么糟糕。
关于Java泛型类参数类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3055969/
我是一名优秀的程序员,十分优秀!