考虑一下代码:
public abstract class Item<T> implements Comparable<T>
{
protected T item;
public int compareTo(T o)
{
return 0; // this doesn't matter for the time being
}
}
public class MyItem<T> extends Item<String>
{
T object;
}
public class Foo<T>
{
protected ArrayList<T> list;
}
public class Bar<V> extends Foo<MyItem<V>>
{
public void sort()
{
Collections.sort(list);
}
}
Run Code Online (Sandbox Code Playgroud)
排序调用给出错误:
绑定不匹配:类型集合的泛型方法sort(List <T>)不适用于参数(ArrayList <MyItem <T >>).推断类型MyItem <T>不是有界参数的有效替代<T extends Comparable <?超级T >>
为什么这是错的?
如果MyItem<V>实施Comparable那么为什么它不是替代品呢?
对不起,如果有人询问,但我觉得这个问题有点具体.
假设我有3个班级:
class Foo
{
protected String var;
public void doSomething()
{
// does something with var
}
}
class A extends Foo
{
public void doSomething()
{
// uses var slightly differently to Foo
}
}
class B extends Foo
{
protected int var; // hides Foo's var field
public void doSomething()
{
// does something with B's var, but still in a similar fashion to Foo
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我知道并希望B的var字段隐藏Foo并仍然以类似的方式使用(打印其值或执行某些计算或其他).
故意隐藏字段会使代码难以阅读,但这是一个例外,还是只是糟糕的设计?
编辑:
我确实希望A从Foo继承'var',但我也希望B继承除var之外的所有内容.
编辑2:
忘记将访问修饰符添加到var.