我可能是错的,但我猜测为什么不能在方法中本地声明枚举? 因为Java中的枚举不能在本地声明,因此返回类型Enum的方法有问题吗?我可以声明一个方法应该返回一个枚举(见下文),但是如何实现这样的方法来返回除null之外的任何东西,或者对在方法外声明的枚举的引用呢?我的第一个倾向是调查使用泛型,但如果SO社区可以帮助我避免它们,我想避免任何延迟.
private Enum resources() {
return null;
}
Run Code Online (Sandbox Code Playgroud) 我试图将两个具有不同参数列表的同名方法继承到派生类.其中一个是派生类中的虚拟和重写,另一个是非虚拟的.这样做,我在尝试从派生类对象访问基类的非虚方法时遇到编译错误.
这是代码片段
class Base {
public:
void f() {
cout << "[Base::f()]" << endl;
}
virtual void f(int arg) {
cout << "[Base::f(" << arg << ")]" << endl;
}
};
class Deriv : public Base {
public:
virtual void f(int arg) {
cout << "[Deriv::f(" << arg << ")]" << endl;
}
};
int main() {
Deriv d;
d.f(-1);
d.f(); // <<-- compile error
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下编译错误:
错误:没有匹配函数调用'Deriv :: f()'
注意:候选者是:virtual void Deriv :: f(int)
我不是C++专家,但直到现在我才认为成员方法可以通过签名完全区分.因此,不应该重写非虚方法Base :: f()并且应该仍然可以访问它.我错了吗? …
可能重复:
接口方法中的最终参数 - 重点是什么?
在试图尝试一些事情时,我遇到了一个问题,就在本页中描述了这个问题.
interface B {
public int something(final int a);
}
abstract class C {
public int other(final int b);
}
class A extends C implements B {
public int something(int a) {
return a++;
}
public int other(int b) {
return b++
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这样的功能可能?我不知道为什么可以通过覆盖方法将最终参数变成非最终参数.为什么方法签名中忽略了final关键字?我如何强制子类在其方法中使用最终变量?
是否可以使用方法签名输出当前堆栈跟踪?我正在尝试调试一些混淆代码,这些代码具有大量具有相同名称的方法,这些方法只有参数和返回类型不同.
有些东西会不工作:
Thread.currentThread().getStackTrace();
new Throwable().getStackTrace();
// etc..
Run Code Online (Sandbox Code Playgroud) 为什么抛出一个方法部分的签名.包含它似乎很奇怪.这是一个阻碍它的例子.
@Overide
public void foo() {
throw new UnsupportedOperationException();
}
Run Code Online (Sandbox Code Playgroud)
如果有人从外面看到这种方法,他们可能会尝试使用它而不知道它不受支持.他们只会在尝试运行代码时学习它.
但是,如果他们可以做这样的事情,他们会通过查看不受支持的方法知道,如果UnsupportedOperationException没有扩展RuntimeException,他们会得到编译错误.编辑1:但这是不可能的,因为抛出是签名的一部分,因此覆盖将不起作用.
@Overide
public void foo() throws UnsupportedOperationException {
throw new UnsupportedOperationException();
}
Run Code Online (Sandbox Code Playgroud)
这个问题与Javas的设计有关,所以我知道如果没有一个人在其上工作并且回答它可能很难回答,但是我希望可能之前已经向他们提出这个问题或者可能存在明显的理由是这样解释原因.
某些预定义方法在其签名中包含ParamArray.但是,代表在签名中不能包含ParamArray.
问题:假设您希望为需要ParamArray的特定方法创建委派机制.你会如何解决这个约束?
编辑:只是为了说清楚,假设你不能改变方法签名本身(预定义的方法,由一些第三方定义,无论是否微软).
EDIT2:这里真正的优点是保持语法糖,因为以下代码确实有效,但消除了糖:
Public Delegate Sub MyDelegate(ByVal myArgs() As Object)
Public Sub PredefinedSub(ByVal ParamArray myArgs() As Object)
'...'
End Sub
Sub Test()
Dim aDelegate As New MyDelegate(AddressOf PredefinedSub)
aDelegate.Invoke(New Object() {1, 2, 3, 4})
End Sub
Run Code Online (Sandbox Code Playgroud)
EDIT3:事实证明,Skeet的解决方案也适用于创建包含ParamArray的事件和操作符.
作为该主题中一般问题的一个实际例子,我想containsAll在Set界面中实现该方法
public boolean containsAll(Iterable<?> c) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
我想这应该是允许的,因为Collection是Iterable意味着这种containsAll将涵盖接口要求.同样,更普遍的是能够实现与参数超类的接口似乎应该工作.
然而,Eclipse说没办法(没有试过直接javac) - 有人可以解释原因吗?我确信规范中的某些内容使其成为现实,但我也想了解需求的动机.或者我错过了Iterable<?>不是超类的东西Collection<?>?
作为一个附带问题 - 鉴于我正在声明两个方法,带有Iterable签名的方法总是首选带有Collection参数的调用?
Eclipse错误:
如果我删除带Collection签名的方法,只留下Iterable一个(见错误后),我得到以下内容:
The type BitPowerSet must implement the inherited abstract method Set<Long>.containsAll(Collection<?>)
确切的实施是:
@Override public boolean containsAll(Collection<?> c) {
for (Object o : c) if (!contains(o)) return false;
return true;
}
public boolean containsAll(Iterable<?> c) {
for (Object o : c) …Run Code Online (Sandbox Code Playgroud) 如果你有一个静态导入的java.lang.Integer类,我的类也有一个静态方法,parseInt(String)那么调用parseInt("12345")指向哪个方法?
提前致谢!
java import static-import method-signature method-declaration
Swift 编译器为带有块的 swift 方法生成的 Objective-C 方法编码似乎使用了任何地方都没有记录的语法。
例如方法:
func DebugLog2(message: String) async -> String
Run Code Online (Sandbox Code Playgroud)
有方法编码:
v32@0:8@"NSString"16@?<v@?@"NSString">24
并且文档中至少有三个字符("、<和)未涵盖:>
该类NSMethodSignature也不喜欢这种编码:
[NSMethodSignature signatureWithObjCTypes:"\"NSString\"16@?<v@?@\"NSString\">24"];
Run Code Online (Sandbox Code Playgroud)
结果是:
'+[NSMethodSignaturesignatureWithObjCTypes:]: '"NSString"16@?<v@?@"NSString">24'' 中不支持类型编码规范 '"'
我尝试查看 Swift 的代码,似乎有一种叫做“扩展方法类型编码”的东西:
但我在试图找出 Swift 代码库中方法类型编码生成的位置时迷失了方向。
不回答此问题的相关问题:
示例代码:
decodeProto()
@objc
class TestClass : NSObject {
@objc
func DebugLog(message: String) -> String {
print(message)
return message
}
@objc
func DebugLog2(message: String) async -> String {
do {
try await Task.sleep(nanoseconds: 1_000_000_000)
} catch {}
print(message); …Run Code Online (Sandbox Code Playgroud) 我正在寻找能够使用其签名提取所有函数和方法的c ++解析器.有这样的事吗?
我看了gccxml那里有问题,它不能使用命名空间,当只有一个头文件时它不好.
method-signature ×10
java ×6
c++ ×2
debugging ×1
delegates ×1
enums ×1
exception ×1
final ×1
generics ×1
header-files ×1
import ×1
interface ×1
methods ×1
objective-c ×1
overloading ×1
paramarray ×1
parsing ×1
stack-trace ×1
swift ×1
vb.net ×1