我正在玩Java的反射API并试图处理一些字段.现在我一直在确定我的领域类型.字符串很简单,就是这样myField.getType().equals(String.class).这同样适用于其他非派生类.但是我如何检查派生类?例如LinkedList作为的子类List.我找不到任何isSubclassOf(...)或extends(...)方法.我是否需要getSuperClass()走遍所有人并自己找到我的supeclass?
如果你想知道一个字符串是否以另一个字符串开头,那你将如何在C++/STL中做到这一点?在Java中String.startsWith,Python也有string.startwith,STL没有直接的方法.相反,有std::string::find和std::string::compare.到目前为止,我使用了两种方法,主要取决于我目前的心情:
if ( str1.compare( 0, str2.length(), str2 ) == 0 )
do_something();
if ( str1.find(str2) == 0 )
do_something();
Run Code Online (Sandbox Code Playgroud)
当然,你也可以做str.substr(0,str2.length()) == str2,也许还有其他一些方法可以达到同样的目的.find有点比较方便compare,但我看到更多人推荐compare这一点find.
但哪一个更受欢迎?有性能差异吗?它是依赖于实现的(GCC,VC++等)吗?
我正在使用Eclipse开发并使用git和gitorious来管理我的存储库.到现在为止,我在命令行中使用了git.我四处寻找将git集成到Eclipse中的方法,并找到了EGit.两年前也有人问过这个问题.但是由于EGit使用JGit,一个用Java编写的git 克隆,我担心它与原始git的兼容性.
我知道EGit缺少一些(可能很多)git的高级功能,因此我会将EGit用于日常基本用途,如提交,检出,拉动和推送,分支等,并使用git进行更高级 - 但不太频繁 - 任务.有经验吗?如果因为git和EGit不同意如何管理它们,我有可能不会使用EGit.
另一个问题:EGit有替代品吗?我找不到任何东西.
我正在玩Java的Reflection.我有一个Base带构造函数的抽象类.
abstract class Base {
public Base( String foo ) {
// do some magic
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一些课程在扩展Base.它们没有太多逻辑.我想用Base构造函数实例化它们,而不必在这些派生类中编写一些代理构造函数.当然,我想用Reflection实例化那些派生类.说:
Class cls = SomeDerivedClass.class;
Constructor constr;
constr = cls.getConstructor( new Class[] { String.class } ); // will return null
Class clsBase = Base.class;
constr = clsBase.getConstructor( new Class[] { String.class } ); // ok
Base obj = (Base) constr.newInstance( new Object[] { "foo" } ); // will throw InstantiationException because it belongs to an abstract class …Run Code Online (Sandbox Code Playgroud) 鉴于一些包装foo.bar.project.something.FirstModule foo.bar.project.something.SecondModule等,它们都有很长foo.bar.project.something的共同点.我如何告诉doxygen隐藏(或至少缩短)这些常见的包名,只打印FirstModule.SomeClass并SecondModule.MyInterface在其输出中?
最近我发现了一个更容易进行模板特化而不是真正继承的情况.派生类只需实现一个纯虚函数,并且没有自己的成员.它是这样的:
#include <iostream>
class Interface {
public:
virtual void calculate() = 0;
virtual float getResult() = 0;
};
class Base : public Interface {
float result;
public:
Base() : result(1) {};
virtual ~Base() {};
virtual void calculate();
virtual float getValue() = 0; // do some very complex calculation here
float getResult() { return result; }
};
class DerivedA : public Base {
public:
DerivedA() : Base() {};
~DerivedA() {};
float getValue();
};
class DerivedB : public Base {
public:
DerivedB() …Run Code Online (Sandbox Code Playgroud) 我正在用C++开发一个图像处理应用程序.我已经看到很多编译器错误和回溯,但这个对我来说是新的.
#0 0xb80c5430 in __kernel_vsyscall ()
#1 0xb7d1b6d0 in raise () from /lib/tls/i686/cmov/libc.so.6
#2 0xb7d1d098 in abort () from /lib/tls/i686/cmov/libc.so.6
#3 0xb7d5924d in ?? () from /lib/tls/i686/cmov/libc.so.6
#4 0xb7d62276 in ?? () from /lib/tls/i686/cmov/libc.so.6
#5 0xb7d639c5 in malloc () from /lib/tls/i686/cmov/libc.so.6
#6 0xb7f42f47 in operator new () from /usr/lib/libstdc++.so.6
#7 0x0805bd20 in Image<Color>::fft (this=0xb467640) at ../image_processing/image.cpp:545
Run Code Online (Sandbox Code Playgroud)
这里发生了什么事?操作员new崩溃了,好的.但为什么?这不是内存不足(它试图分配大约128Kb,128x64像素,每个都有两个浮点数).此外,它不会接缝,因为它是我自己的代码中的错误(构造函数不会被触及!).
上述行(#7)中的代码是:
Image<Complex> *result = new Image<Complex>(this->resX, resY);
// this->resX = 128, resY = 64 (both int), Complex is a typedef for std::complex<float>
Run Code Online (Sandbox Code Playgroud)
几乎相同的实例化在我的代码中的其他地方起作用.如果我注释掉这部分代码,稍后会在类似的部分崩溃.我不明白,我也没有任何想法,如何调试它.有帮助吗? …
我正在进行List实施.因此,我必须覆盖这些方法
Collection.containsAll(Collection<?> c);
Collection.removeAll(Collection<?> c);
Collection.retainAll(Collection<?> c);
Run Code Online (Sandbox Code Playgroud)
但正如Sun所解释的那样,他们接受任何类型内容的集合(请注意<?>).因此编译器不会检查集合,而是由我来检查它.但怎么办呢?instanceof由于类型擦除,每个元素都不起作用.下一个解决方案是将每个元素强制转换为ClassCastException.看这里:
public boolean containsAll( Collection<?> c ) {
boolean foundAll = true;
for ( Object element : c ) {
try {
foundAll &= this.contains( (T) element );
} catch ( ClassCastException e ) {
foundAll = false;
}
}
return foundAll;
}
Run Code Online (Sandbox Code Playgroud)
其他两种方法看起来相似.这样可行.但它给了我编译器警告"警告:[unchecked] unchecked cast"!除非我用" @SuppressWarnings("unchecked")"来压制它,否则它将无法正常编译.
@SuppressWarnings("unchecked")除非我真的需要,否则我不想依赖" ".有没有办法避免它?你会如何实现这些方法containsAll(Collection<?> c)?
编辑
对不起,伙计们,我还不够清楚.我不延伸AbstractList,我不想.我的列表由平衡二叉树实现.我有一个自己的实现的insert(),remove(),contains() …
java ×4
c++ ×3
reflection ×2
backtrace ×1
class ×1
collections ×1
constructor ×1
doxygen ×1
eclipse ×1
egit ×1
gdb ×1
generics ×1
git ×1
inheritance ×1
stl ×1
string ×1
templates ×1