【问题标题】:Using interface type in a class在类中使用接口类型
【发布时间】:2018-01-24 07:05:18
【问题描述】:

我试图理解这个概念。其中Path 类型是使用Paths 的类方法创建的。

我有两个疑问:

  1. 如何在我们创建的类中拥有 Path 类型,而类中没有任何 Path 接口引用(例如,实现)。

代码sn-p:

 Path dir = Paths.get(args[dirArg]);

我发现这个sn-p所在的类,没有接口路径的实现。

类中的导入包:

import java.nio.file.*;
import static java.nio.file.StandardWatchEventKinds.*;
import static java.nio.file.LinkOption.*;
import java.nio.file.attribute.*;
import java.io.*;
import java.util.*;
  1. 在类中我们如何创建一个返回Interface 类型的方法。对于前Paths 的类获取方法。在Paths 类中没有连接到Path 接口的链接。那么它是如何在 Java 中定义的呢?我怎么理解这个?

请给我一些光明...!

【问题讨论】:

  • 类的声明包是什么?
  • 该类的所有导入问题都提到了..!

标签: java class interface


【解决方案1】:

您调用的 get 方法将创建(并返回)您的接口的实现。

假设你有一个接口Action:

public interface Action {
  void doSomething();
}

你有一个电话:

Action action = X.getAction();

使用以下 X 类:

public class X {

  public Action getAction() {
      return new Action() {
          public void doSomething() {
              System.out.println("done");
          };
 }

}

因此,即使没有实现Action 的特定类,getAction() 方法也会返回一个(匿名)类来实现您的接口。

如果有一个实现你的接口的类,代码并没有那么不同:此时,getAction() 方法可能会返回该类的一个实例。

【讨论】:

    【解决方案2】:

    我们如何在我们创建的类中拥有 Path 类型,而类中没有任何 Path 接口引用(例如,实现)。

    真正的答案是,你不需要关心。

    get 方法返回某种实现Path 的对象,这是肯定的。你不需要知道更多关于那是什么路径的信息。您需要知道的所有代码是它返回一个Path,故事结束。

    从外面你可能看不到实现Path 的类,但实际上一定有一个。只是你不知道而已。

    但是,可以返回 Path 的实际类型。

    System.out.println(Paths.get("/Users/").getClass()); // getClass returns the type
    

    这会打印class sun.nio.fs.UnixPath,这似乎不是公共类。

    在类中我们如何创建一个返回接口类型的方法。对于 ex Paths 的类 get 方法。在 Paths 类中,没有连接到 Path 接口的链接。那么它是如何在 Java 中定义的呢?我怎么理解这个?

    您当然可以创建具有接口返回类型的方法!

    interface MyInterface { ... }
    
    class A implements MyInterface { ... }
    
    class B {
        public static MyInterface myMethod() {
            // obviously you can add more logic than this, this is just an example
            return new A();
        }
    }
    

    现在作为该方法的调用者,

     MyInterface i = B.myMethod(); // you don't (need) know what actual type of object "i" is.
    

    【讨论】:

    • B.myMethod() 在这里创建一个 A 类的对象并返回一个 MyInterface 类型,该类型引用 A 类对象。正确的..?但是如果我们没有“class A implements MyInterface { ... }”,那么在这种情况下它会创建匿名类吗..?
    猜你喜欢
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多