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
声明方法。
通常,对于泛型类型,使用单个大写字母,即I
或O
,因此不会将它们与实际类混淆。您当然也可以将抛出的Exception
设为通用......:public interface MyInterface<I, O, E extends Exception>
我的实现中需要抛出异常的方法。以上是关于Java在Interface中创建方法并更改参数类型的主要内容,如果未能解决你的问题,请参考以下文章
在java中创建一个rectangle类,使其有width,height两个属性,并且包含?两个方
如何在 Interface Builder 中创建 NSTableRowView 原型