Java在Interface中创建方法并更改参数类型

Posted

技术标签:

【中文标题】Java在Interface中创建方法并更改参数类型【英文标题】:Java create method in Interface and change the parameter type 【发布时间】:2016-11-13 19:35:06 【问题描述】:

如何创建一个在 Overridden 时可以有不同类型的接口?有时我希望该方法接受“htmlPage”类型的项目,而其他时候我希望它采用“文档”类型。稍后这些可能会更改为更多类型。

示例:

public interface MyInterface
   void checkThis() throws Exception;

   Output Show(Input input, String url) throws Exception;


public class HeadLevel extends MyInterface<HtmlPage,String>
   Output scrape(HtmlPage page, String url) throws Exception;


public class MyClass implements HeadLevel<Output>
   @Override 
   public void checkThis(Document page, String url)

   

我认为这样的事情应该是可以实现的。我尝试在搜索中使用关键字“Overload”和“Override”四​​处寻找,但找不到可以像这样工作的东西。如您所见,“MyClass”已覆盖该方法并已定义正在使用的参数。

【问题讨论】:

首先你的语法是错误的。其次Class可以扩展另一个类而不是接口,而Class实际上实现了接口。 和我的项目大体相似。 这在技术上是不可能的,因为checkThis(Document, String) 不会也不能覆盖checkThis()。但是,如果您告诉我们您想通过此方法完成什么,我们或许能够找到解决方法。 正如@Zircon 提到的,在更改参数时不可能“覆盖”方法(因为它们是方法签名的一部分;请注意,在 Java 语言中,返回值不是签名,但是在 JVM 中是这样)。这闻起来像 XY-problem,所以请描述您想要实现的目标,而不是展示您的方法。 【参考方案1】:

感觉你是在试图强迫代码解决一个你看不清楚的问题。我喜欢退后一步思考组件之间的联系,并在这种情况下改进我的设计。

也许按照 HtmlPage 是文档的思路来思考。所以,如果你 使用 Document (public class HtmlPage extends Document) 扩展 HtmlPage。当一个接口方法接受 Document 时,它将采用 HtmlPage。假设您可以控制 Document 和 HtmlPage 之间的关系,换句话说,您没有使用第三方库。一旦完成,一个方法就不需要对两个不相关的概念进行操作。

我不清楚您的问题的定义,更好的命名可能会有所帮助,无论哪种方式,潜在的解决方案可能如下所示:

interface MyInterface
    <K extends Document> void checkThis(K htmlPage) throws Exception;

    Output Show(Input input, String url) throws Exception;


class HeadLevel implements MyInterface
    public <K extends Document> void checkThis(K htmlPage) throws Exception
    
        // Do something
    

    public Output Show(Input input, String url) throws Exception
        return new Output();
    

    public <K extends Document> Output scrape(K htmlPage, String url) throws Exception
    
        return new Output();
    


class MyClass extends HeadLevel

    public MyClass() throws Exception
    
        checkThis(new HtmlPage());
        checkThis(new Document());
    

    public <K extends Document> void checkThis(K htmlPage) throws Exception
    
        super.checkThis(htmlPage);
    


class Document



class HtmlPage extends Document



https://docs.oracle.com/javase/tutorial/java/generics/types.html

【讨论】:

【参考方案2】:

这种情况下你不需要任何接口,也不可能做你想做的,你需要在使用前了解接口的概念。

https://docs.oracle.com/javase/tutorial/java/concepts/interface.html

【讨论】:

我有什么办法可以通过界面来实现这一点? 或者类似的替代方案? 为什么要使用接口?你真正想做什么,解释你的问题。 我想要一个可以改变参数的方法。所以我会有默认参数,然后能够更改它们。类似于计算正方形面积的方法,采用整数长度和整数宽度,但是对于三角形,您可以覆盖和更改双半径和双高的参数。例如 第一件事:你对“OVERRIDE”的概念是错误的,覆盖一个方法意味着你复制相同的签名(相同的返回,相同的名称,相同的参数)并实现括号之间的内容。 【参考方案3】:

我正在寻找的实现结果不存在,但是有更好的方法可以使用输入和输出来完成我正在寻找的事情。

public interface MyInterface<Input, Output> 
   void checkThis(Input input, Output output) throws Exception;

   Output Show(Input input, String url) throws Exception;


public class HeadLevel extends MyInterface<HtmlPage,String>
   Output scrape(HtmlPage page, String url) throws Exception;


public class MyClass implements HeadLevel<Output>
   @Override 
   public void checkThis(Document page, String url)

   

似乎答案就在我的眼皮底下。我误解了输入/输出类型是什么以及如何使用它们。输入和输出可以是您希望进入或退出应用程序的任何时间。

输入是程序完成所需的任何信息 它的执行。程序输入可能采取多种形式

输入可以采用多种不同类型的形式,例如 HtmlPage、Document 和 String。使用输入,您可以覆盖您的方法并拥有您想要的类型。

你可以阅读更多关于输入和输出here

【讨论】:

永远不要用throws Exception声明方法。 通常,对于泛型类型,使用单个大写字母,即IO,因此不会将它们与实际类混淆。您当然也可以将抛出的Exception 设为通用......:public interface MyInterface&lt;I, O, E extends Exception&gt; 我的实现中需要抛出异常的方法。

以上是关于Java在Interface中创建方法并更改参数类型的主要内容,如果未能解决你的问题,请参考以下文章

在打字稿中的类中创建具有未知参数的方法

在java中创建一个rectangle类,使其有width,height两个属性,并且包含?两个方

如何在 Interface Builder 中创建 NSTableRowView 原型

在Java类方法中参数为interface接口对象的作用是啥?

在 Java 中创建日期的正确方法是啥? [复制]

无法关闭在 Interface Builder 中创建的 NSView 实例的剪辑