有接口参数时是否可以自动选择适当的 class 方法?
Is it possible to automatically chose the appropriated class method when having an interface argument?
好的,我已经搜索过了,但找不到这个特定问题的答案。这可能是一个反复出现的问题,我不知道正确的术语来指代它,所以感谢所有帮助。 :)
假设我们有一个方法 m0,它从接口 I 接收一个对象,即对象 i。
Class A 和 B 扩展接口 I,因此对象 i 可以是 class A 或 B。
然后,在方法 m1 中,我想使用接口 I 中声明的方法 mi,它接收接口 I 的参数。
在 Classes A 和 B 中,我实现了 mi,我希望 mi 根据参数运行。如果 mi 接收到 class A 的对象,我希望它使用来自 class A 的 mi 实现,否则,我想要来自 class B 的实现。我不想如果对象是 A 或 B 的实例,请检查方法 m0,因为我希望该方法是独立的并且仅依赖于接口 I。有机会我想引入更多 classes 扩展一.
public boolean m0(I i1, I i2){
return i1.mi(i2);
}
public interface I{
public boolean mi(I i);
}
class A implements I{
boolean boolValue;
...
mi(I i){
if(this.boolValue == i.boolValue)
return true;
return false;
}
}
class B implements I{
int intValue;
...
mi(I i){
if(this.intValue == i.intValue)
return true;
return false;
}
}
想法是 class A 和 B 在本质上是不同的,但我希望它们具有共同的 mi 方法。所以 i1.mi(i2) 应该根据参数 i2 进行调整。保证 i1 和 i2 在 m0 中总是相同的 class。然而,在两个 classes 的 m0 方法实现中,我不允许访问第 i 个对象属性 booleanValue 或 intValue(取决于参数类型)。
我已经编辑了问题,因为我没有正确解释问题,无论如何感谢你到目前为止的回答。
谢谢
编辑:此问题已解决。要实现我正在寻找的那种行为,可以使用通用类型。 https://docs.oracle.com/javase/tutorial/java/generics/types.html
你似乎把事情复杂化了很多。您的实现应该 return 您想要的值,仅此而已,并且不需要指向自身的指针,因为您可以使用它。
public boolean m0(I i){
return i.mi();
}
public interface I{
public boolean mi();
}
class A implements I{
boolean a = true;
mi(){
return this.a;
}
}
class B implements I{
boolean b = false;
mi(){
return this.b;
}
}
当然,在您的精确示例中,您可以对方法中的值进行硬编码:
class A implements I{
boolean mi(){
return true;
}
}
注意:您需要使用 implements
而不是 extends
因为 I 是一个接口。
编辑:
你已经澄清了这个问题。我不太确定你是如何得出这样一个设计的,所以也许你应该回顾一下你的整个设计,但鉴于你的问题,这就是你如何实现它的。基本上在您的界面上添加一个泛型类型,以便您的界面充当此类型的包装器。
该代码可能比任何冗长的解释都更容易理解:
public <T> boolean m0(I<T> i1, I<T> i2){
return i1.mi(i2.getT());
}
public interface I<T>{
public T getT();
public boolean mi(T i);
}
class A implements I<A>{
boolean boolValue;
public A getT() {
return this;
}
public boolean mi(A i){
if(this.boolValue == i.boolValue)
return true;
return false;
}
}
class B implements I<B>{
int intValue;
public B getT() {
return this;
}
public boolean mi(B i){
if(this.intValue == i.intValue)
return true;
return false;
}
}
所以你的 类 都定义了 return 本身的 getT()
,以及采用确切子类的方法 mi。编译器还保证您只能调用具有匹配类型的 m0。
布尔变量没有在接口中声明,所以你不能那样做。 return this.a 或 this.b 在方法 mi 中(以上答案)或将布尔值放入接口:
public boolean m0(I i){
return i.mi();
}
public interface I{
boolean a;
public boolean mi();
}
class A implements I{
public A(){
a = true;
}
mi(){
return this.a;
}
}
class B implements I{
public B(){
a = false;
}
mi(){
return this.a;
}
}
假设,您有如下函数 m0 并且方法 mi() 在实现接口 I
的 class A 和 B 中实现
public boolean m0(I i){
return i.mi()
}
如果你实例化为,
I val1 = new A()
val1.mi()
将调用在 class A
中实现的方法
如果你实例化为,
I val2 = new B()
val2.mi()
将调用在 class B
中实现的方法
就这么简单。
你没有。你的代码有很多错误。但我认为这个答案解决了你的问题。
好的,我已经搜索过了,但找不到这个特定问题的答案。这可能是一个反复出现的问题,我不知道正确的术语来指代它,所以感谢所有帮助。 :)
假设我们有一个方法 m0,它从接口 I 接收一个对象,即对象 i。
Class A 和 B 扩展接口 I,因此对象 i 可以是 class A 或 B。
然后,在方法 m1 中,我想使用接口 I 中声明的方法 mi,它接收接口 I 的参数。
在 Classes A 和 B 中,我实现了 mi,我希望 mi 根据参数运行。如果 mi 接收到 class A 的对象,我希望它使用来自 class A 的 mi 实现,否则,我想要来自 class B 的实现。我不想如果对象是 A 或 B 的实例,请检查方法 m0,因为我希望该方法是独立的并且仅依赖于接口 I。有机会我想引入更多 classes 扩展一.
public boolean m0(I i1, I i2){
return i1.mi(i2);
}
public interface I{
public boolean mi(I i);
}
class A implements I{
boolean boolValue;
...
mi(I i){
if(this.boolValue == i.boolValue)
return true;
return false;
}
}
class B implements I{
int intValue;
...
mi(I i){
if(this.intValue == i.intValue)
return true;
return false;
}
}
想法是 class A 和 B 在本质上是不同的,但我希望它们具有共同的 mi 方法。所以 i1.mi(i2) 应该根据参数 i2 进行调整。保证 i1 和 i2 在 m0 中总是相同的 class。然而,在两个 classes 的 m0 方法实现中,我不允许访问第 i 个对象属性 booleanValue 或 intValue(取决于参数类型)。
我已经编辑了问题,因为我没有正确解释问题,无论如何感谢你到目前为止的回答。
谢谢
编辑:此问题已解决。要实现我正在寻找的那种行为,可以使用通用类型。 https://docs.oracle.com/javase/tutorial/java/generics/types.html
你似乎把事情复杂化了很多。您的实现应该 return 您想要的值,仅此而已,并且不需要指向自身的指针,因为您可以使用它。
public boolean m0(I i){
return i.mi();
}
public interface I{
public boolean mi();
}
class A implements I{
boolean a = true;
mi(){
return this.a;
}
}
class B implements I{
boolean b = false;
mi(){
return this.b;
}
}
当然,在您的精确示例中,您可以对方法中的值进行硬编码:
class A implements I{
boolean mi(){
return true;
}
}
注意:您需要使用 implements
而不是 extends
因为 I 是一个接口。
编辑: 你已经澄清了这个问题。我不太确定你是如何得出这样一个设计的,所以也许你应该回顾一下你的整个设计,但鉴于你的问题,这就是你如何实现它的。基本上在您的界面上添加一个泛型类型,以便您的界面充当此类型的包装器。 该代码可能比任何冗长的解释都更容易理解:
public <T> boolean m0(I<T> i1, I<T> i2){
return i1.mi(i2.getT());
}
public interface I<T>{
public T getT();
public boolean mi(T i);
}
class A implements I<A>{
boolean boolValue;
public A getT() {
return this;
}
public boolean mi(A i){
if(this.boolValue == i.boolValue)
return true;
return false;
}
}
class B implements I<B>{
int intValue;
public B getT() {
return this;
}
public boolean mi(B i){
if(this.intValue == i.intValue)
return true;
return false;
}
}
所以你的 类 都定义了 return 本身的 getT()
,以及采用确切子类的方法 mi。编译器还保证您只能调用具有匹配类型的 m0。
布尔变量没有在接口中声明,所以你不能那样做。 return this.a 或 this.b 在方法 mi 中(以上答案)或将布尔值放入接口:
public boolean m0(I i){
return i.mi();
}
public interface I{
boolean a;
public boolean mi();
}
class A implements I{
public A(){
a = true;
}
mi(){
return this.a;
}
}
class B implements I{
public B(){
a = false;
}
mi(){
return this.a;
}
}
假设,您有如下函数 m0 并且方法 mi() 在实现接口 I
的 class A 和 B 中实现public boolean m0(I i){
return i.mi()
}
如果你实例化为,
I val1 = new A()
val1.mi()
将调用在 class A
中实现的方法如果你实例化为,
I val2 = new B()
val2.mi()
将调用在 class B
中实现的方法就这么简单。 你没有。你的代码有很多错误。但我认为这个答案解决了你的问题。