我有一个方法,通过单个方法调用内部变化,我想传递它作为参数变化的方法的方法/签名...这可能在目标C中,或者是太多希望对于?
如果我尝试编写如下方法
public void someStuff(Object ... args, String a )
Run Code Online (Sandbox Code Playgroud)
我收到这个错误
someStuff方法的变量参数类型Object必须是最后一个参数.
我不完全理解变量参数类型的要求是最后一个.任何输入都会有所帮助.
我想要一个将执行任何外部方法的类,如下所示:
class CrazyClass
{
//other stuff
public AnyReturnType Execute(AnyKindOfMethod Method, object[] ParametersForMethod)
{
//more stuff
return Method(ParametersForMethod) //or something like that
}
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?是否有代理人采用任何方法签名?
读的Javadoc的@Override注释,我遇到了以下规则:
如果使用此批注类型对方法进行批注,则编译器需要生成错误消息,除非至少满足下列条件之一:
- 该方法会覆盖或实现在超类型中声明的方法.
- 该方法的签名覆盖等效于Object中声明的任何公共方法.
我对第一点很清楚,但我不确定第二点.
"覆盖等价"是什么意思?Object在这方面,公共方法有何特别之处?为什么这不属于第一个标准?
更新说明:这仅适用于Java 7文档.在Java 6的文档不说的覆盖等价什么.为什么要改变?
在咨询了JLS(第8.4.2节)之后,我发现了以下对覆盖等价的解释:
的方法的签名
m1是一个子签名的方法的签名m2,如果任一:
m2具有相同的签名m1,或- 签名与签名
m1的擦除(§4.6)相同m2.两个方法签名
m1并且m2是覆盖等效的,如果它们m1是子签名m2或是m2其子签名m1.
据我所知,这回答了第一个问题("它是什么意思?")和第三个问题("为什么第一个条件不包括这个?").
如果我理解正确(如果我没有请通知我!),只有一种情况,两种方法是覆盖等价的,并且不属于原始问题的第一个条件.当子类方法的签名的擦除与超类方法的签名相同时,情况就是这种情况,而不是相反.
因此,当我们在尝试"覆盖"类的公共方法时尝试添加类型参数时,原始问题的第二个条件才会发挥作用Object.我尝试了以下简单示例来测试它,使用未使用的类型参数:
public class Foo {
@Override
public <T> boolean equals(Object obj) {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这个类没有编译,因为该方法不实际 …
java overriding annotations language-design method-signature
我想从一个DLL调用一个方法,但我没有源文件头文件.我试图使用dumpbin/exports来查看方法的名称,但我可以找到方法签名?
有没有办法调用这种方法?
谢谢,
假设我正在设计类似以下界面:
public interface MyInterface{
public MyInterface method1();
public void method2(MyInterface mi);
}
Run Code Online (Sandbox Code Playgroud)
但是,有一点需要注意,返回类型for method1和参数method2匹配具体实现而不仅仅是MyInterface.也就是说,如果我有MyInterfaceImpl这个实现MyInterface,它需要具有以下内容:
public class MyInterfaceImpl implements MyInterface{
@Override
public MyInterfaceImpl method1(){...}
@Override
public void method2(MyInterfaceImpl mi){...}
}
Run Code Online (Sandbox Code Playgroud)
如上所述,method1不会导致任何编译错误,但没有任何保证返回类型在所有实现中都匹配.当然method2甚至不会编译,因为签名与接口不匹配.
一个候选解决方案是在泛型中使用自引用或递归边界:
public interface MyInterface<T extends MyInterface<T>>{
public T method1();
public void method2(T mi);
}
public class MyInterfaceImpl implements MyInterface<MyInterfaceImpl>{
@Override
public MyInterfaceImpl method1();
@Override
public void method2(MyInterfaceImpl mi);
}
Run Code Online (Sandbox Code Playgroud)
这将得到我想要的一个例外:其他实现可能会传递错误的泛型类型(没有任何力量T来匹配具体类型).所以其他人可能会实现以下内容:
public class NotMyInterfaceImpl implements MyInterface<MyInterfaceImpl>{ …Run Code Online (Sandbox Code Playgroud) 我正在阅读Apple 关于Objective-C运行时类型编码字符串的文章 ,有些方法在其类型字符串中有数字.
数字v12@0:4@8是什么意思?
我经常看到两种方法接口的冲突策略,概括如下:
// Form 1: Pass in an object.
double calculateTaxesOwed(TaxForm f) { ... }
// Form 2: Pass in the fields you'll use.
double calculateTaxesOwed(double taxRate, double income) { ... }
// use of form 1:
TaxForm f = ...
double payment = calculateTaxesOwed(f);
// use of form 2:
TaxForm f = ...
double payment = calculateTaxesOwed(f.getTaxRate(), f.getIncome());
Run Code Online (Sandbox Code Playgroud)
我见过第二种形式的拥护者,特别是在动态语言中,可能更难评估正在使用的字段.
但是,我更喜欢第一种形式:它更短,错误的空间更小,如果对象的定义稍后更改,您不一定需要更新方法签名,也许只是改变您使用内部对象的方式.方法.
这两种形式都有令人信服的一般情况吗?是否有明确的例子说明何时应该使用第二种形式?我可以指出是否有SOLID或其他OOP原则来证明我决定使用一种形式而不是另一种形式?如果您使用动态语言,上述任何答案都会改变吗?
Stream.Write使用的对我来说似乎非常不合逻辑int,而不是UInt......对于这个事实,除了"遗留"代码之外是否有其他解释?有人想写-1字节吗?!?
method-signature ×10
java ×3
c# ×2
generics ×2
objective-c ×2
.net ×1
annotations ×1
c++ ×1
delegates ×1
dll ×1
dumpbin ×1
eclipse ×1
interface ×1
oop ×1
overriding ×1
perl ×1
perl-tidy ×1
reflection ×1
return-type ×1
signature ×1