Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不是所有函数都是多态的_Java - Fatal编程技术网

Java 不是所有函数都是多态的

Java 不是所有函数都是多态的,java,Java,从没有解决方案的旧考试中: 鉴于此代码 import java.util.*; public class AClass { private int f(List<Integer> list){ int i = 0; //Something useful return i; } public int g() { List<Integer> myList = new LinkedList

从没有解决方案的旧考试中:

鉴于此代码

import java.util.*;

public class AClass {
    private int f(List<Integer> list){
        int i = 0;
        //Something useful
        return i;
    }
    public int g() {
        List<Integer> myList = new LinkedList<Integer>();
        return f(myList);
    }   
}
import java.util.*;
公共类AClass{
专用int f(列表){
int i=0;
//有用的东西
返回i;
}
公共int g(){
List myList=newlinkedlist();
返回f(myList);
}   
}
请注意,方法
f
是多态的,即它可以传递给接口列表的任何实现。另一方面,方法
g
不是。当它构造对象
myList
时,如果不知道其类型,它就无法执行此操作。因此,它不能是多态的。我们的代码包含了许多遭受相同问题的方法。我们的目标是使代码具有多态性

  • 这个问题的标准解决方案的名称是什么
  • 在这个例子中描述它
  • 松耦合解决这个问题的方法有很多:编程到接口和应用

  • 方法
    g()。例如,如果要使用
    ArrayList
    ,则需要打开该类并显式修改该方法,并可能引入bug。此外,您可能需要重新测试并记录。另一方面,方法
    f()
    更加灵活,因为您可以只传递所需的集合,而该方法不知道您正在传递的具体实现,从而保持方法的关闭


  • 你这是什么意思?请举例说明。使此代码更通用的唯一方法是使用
    集合
    可伸缩
    ,而不是
    列表
    ,但我认为这在松耦合方面是一种过激的做法。

    显然,这种情况下的解决方案是创建一个
    抽象工厂模式


    例如,我们将创建一个名为
    AClassCreator
    的新类,并有一个方法
    createAClass(List List)
    ,其中参数是List的子类。

    1。或者:编程到接口。松耦合更具包容性。回答不错。最好使用您需要的接口(
    List
    ),而不是具体的实现(
    LinkedList
    ArrayList
    等)。如果需要使用接口中未定义的特定于该类的方法,您可以稍后使用该类。您可以插入类似于
    Provider
    的内容,但是引用
    计算机科学中的所有问题都可以通过另一个间接层次来解决。。。除了间接寻址层太多的问题。
    这里想到;)@Bartzilla-调用
    newLinkedList()
    不是紧密耦合,即创建列表实例。紧密耦合会将LinkedList传递到f()。@ike_love您显然不理解DI的概念。首先,如何创建列表的实例?你不能!列表是一个接口。迪就是这样!!将可能更改的对象(例如工厂等)的实例化外部化,这样您就可以不必维护经过测试、记录和编译的类。在这种情况下,如果需要其他类型的列表,LinkedList可能会更改发生的情况?哦,好吧!您将需要打开该类并对其进行修改,并且可能会破坏它。这正是你错的地方!我建议你读一本关于DI的好书。
    Consequently, it cannot be polymorphic. Our code contains many methods suffering from the same problem. We aim to make our code polymorphic.