接受包含特定方法的对象,而不是接受特定类型

时间:2019-06-18 06:08:16

标签: java generics polymorphism dynamic-typing

[编辑]:这个问题是关于我无法控制的类型的。因此,使它们无法继承超类或实现接口是不可能的。我希望不封装类型就能做到这一点。

我想编写一个方法,将包含特定方法的所有对象作为参数接受。

例如,我们有2种完全不同的类型,它们都包含具有相同签名的 recipientList.forEach(function (recipient) { let personalizedContent = replaceAll(emailContent, '[First Name]', firstName); personalizedContent = replaceAll(emailContent, '[Last Name]', lastName); personalizedContent = replaceAll(emailContent, '[Email]', recipient.EmailAddress.Address); var message = { "Message": { "Subject": subject, "Body": { "ContentType": "html", "Content": personalizedContent }, "ToRecipients": [recipient], "Attachments": [] }, "SaveToSentItems": "true" }; postEmail(accessToken,message); }); 方法:

get

如何编写可以接受这两种类型的方法?

public class TypeOne {
  public int get() { /* Some implementation */ }
}

public class TypeTwo {
  public int get() { /* Some other implementation */ }
}

2 个答案:

答案 0 :(得分:6)

首先使方法成为非静态方法,其次使两个类都实现具有get方法的接口。最后,更改callGetOnObject以接受实现该接口的类的实例:

public interface Getter {
  int get();
}

public class TypeOne implements Getter {
  public int get() { /* Some implementation */ }
}

public class TypeTwo implements Getter {
  public int get() { /* Some other implementation */ }
}

然后:

public static int callGetOnObject(Getter gettableObject) {
  return gettableObject.get();
}

编辑:

由于问题已被修改,因此,这是新的答案:如果您不控制此代码并且不愿意包装它,那么您就不走运了:无法通过AFAIK进行处理。

答案 1 :(得分:2)

据我所知,无法通过检查传入对象是否具有特定方法来对其进行实际过滤,但是您可以使用反射来验证输入,然后调用该函数。这是一个示例:

const WithContext = (Component) => {
    return (props) => (
        <CustomContext.Consumer>
            {value =>  <Component {...props} value={value} />}
        </CustomContext.Consumer>
    )
}