相关疑难解决方法(0)

为什么没有参数反差方法可以覆盖?

重写方法时,C++和Java支持返回类型协方差.

但是,它们都不支持参数类型的反差 - 相反,它转换为过(Java)或隐藏(C++).

那是为什么?在我看来,允许这样做是没有害处的.我可以在Java中找到它的一个原因 - 因为它无论如何都有"选择最特定版本"的重载机制 - 但是不能想到C++的任何原因.

示例(Java):

class A {
    public void f(String s) {...}
}
class B extends A {
    public void f(Object o) {...} // Why doesn't this override A.f?
}
Run Code Online (Sandbox Code Playgroud)

c++ java oop overriding variance

26
推荐指数
3
解决办法
4187
查看次数

为什么不允许在重写方法中使用参数类型(一个是原始的而另一个是包装器)的区别?

我最近开始使用JAVA编程并且有一个问题要问.假设我有一个SuperClass和一个SubClass,它扩展了SuperClass并尝试覆盖SuperClass中定义的方法,如下所示:

  public class SuperClass{
    public void method1(int val){
      System.out.println("This is method in SuperClass.Val is:" + val);
      }
  }
Run Code Online (Sandbox Code Playgroud)

我尝试在我的SubClass中扩展SuperClass并使用一个例外覆盖该方法,而不是int在method1中声明的类型,我使用参数的类型Integer,如下所示:

  public class SubClass extends SuperClass{
    @Override 
    public void method1(Integer val){     ///compiler gives an error

     }
  }  
Run Code Online (Sandbox Code Playgroud)

编译器不允许使用SubClass方法的声明(我正在使用eclipse IDE).为什么会这样?整数本质上是int的包装,那为什么禁止这样的声明呢?

谢谢

java polymorphism inheritance

6
推荐指数
1
解决办法
853
查看次数

为什么不能通过不太具体的功能来实现Java接口

为什么我不能用Java做到这一点:

interface Context{
    void add(Integer o);
}
class Subclass implements Context{
    @Override
    public void add(Object o){...}
}
Run Code Online (Sandbox Code Playgroud)

难道Subclass.add不会实现Context.add,因为它添加(Object)可以执行所有add(Integer)可以吗?

这有什么好办法?

现在我正在做一种丑陋的方式:

private void actuallyAdd(Object o){...}
public void add(Object o){actuallyAdd(o);}
public void add(Integer o){actuallyAdd(o);}
Run Code Online (Sandbox Code Playgroud)

编辑:这不是上述问题的重复.在给定的问题中,超类是具有更通用的"对象"作为参数的超类,而子类更具体.这不起作用,因为更具体的方法可能无法处理任何对象.在我的问题中,子类不如超类特定,这意味着子类总是能够处理超类所需的任何内容.

java oop interface

1
推荐指数
1
解决办法
49
查看次数

子类型如何"保证"它将使用更具体的类型调用回调?

这是我基本上想要的代码,它不会编译:

interface Interface {
  interface ArgumentInterface {
    // Some methods
  }

  void doCallback(Consumer<? super ArgumentInterface> callback);
}

interface SubInterface extends Interface {
  interface ArgumentSubInterface extends ArgumentInterface {
    // Some more methods
  }

  @Override
  void doCallback(Consumer<? super ArgumentSubInterface> callback);
}
Run Code Online (Sandbox Code Playgroud)

这里的想法是Interface将ArgumentInterface的实例传递给用户提供的Consumer,而SubInterface将传递更具体的ArgumentSubInterface的实例.特别是,我希望用户能够将Consumer <ArgumentSubInterface>传递给SubInterface.doCallback()并使其工作.

天真地看起来这应该像写作一样:接口版本接受的任何参数也将被SubInterface的版本接受.但是,Java声称该方法不会覆盖.

java generics

0
推荐指数
1
解决办法
55
查看次数