任何时候我必须将我的项目重新导入Eclipse(如果我重新安装Eclipse,或者更改了项目的位置),几乎所有重写的方法都没有正确格式化,导致错误:
该方法必须覆盖超类方法
值得注意的是,这是Android项目 - 无论出于何种原因,方法参数值并不总是填充,所以我必须自己手动填充它们.例如:
list.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
//These arguments have their correct names
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
}
});
Run Code Online (Sandbox Code Playgroud)
最初将填充如下:
list.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
//This methods arguments were not automatically provided
public void onCreateContextMenu(ContextMenu arg1, View arg2,
ContextMenuInfo arg3) {
}
});
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我删除我的代码,并让Eclipse自动重新创建方法,它使用我已经拥有的相同参数名称,所以我真的不知道问题在哪里,除此之外它自动格式化方法我.
这需要手动重新创建所有重写的方法,这变得非常痛苦.如果有人能解释为什么会发生这种情况或如何解决它......我会非常高兴.
也许这是由于我格式化方法的方式,这是在另一个方法的参数内?
我读了这个问题并认为如果有人可以写的话很容易解决(不是没有它可以解决):
@Override
public String toString() {
return super.super.toString();
}
Run Code Online (Sandbox Code Playgroud)
我不确定它在许多情况下是否有用,但我想知道为什么它不是,如果这样的东西存在于其他语言中.
你们有什么感想?
编辑: 澄清:是的,我知道,这在Java中是不可能的,我不会真的错过它.这不是我期望的工作,并且惊讶于编译错误.我刚才有了这个想法并想讨论它.
以下使用super()引发了一个TypeError:为什么?
>>> from HTMLParser import HTMLParser
>>> class TextParser(HTMLParser):
... def __init__(self):
... super(TextParser, self).__init__()
... self.all_data = []
...
>>> TextParser()
(...)
TypeError: must be type, not classobj
Run Code Online (Sandbox Code Playgroud)
StackOverflow上有一个类似的问题:Python super()引发TypeError,其中错误的解释是用户类不是新式类.但是,上面的类是一个新式的类,因为它继承自object:
>>> isinstance(HTMLParser(), object)
True
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我怎么用super(),在这里?
使用HTMLParser.__init__(self)而不是super(TextParser, self).__init__()工作,但我想了解TypeError.
PS:Joachim指出,作为一个新式的实例并不等同于一个object.我多次反复阅读,因此我的困惑(基于object实例测试的新式类实例测试示例:https://stackoverflow.com/revisions/2655651/3).
class A:
def __init__(self):
print("world")
class B(A):
def __init__(self):
print("hello")
B() # output: hello
Run Code Online (Sandbox Code Playgroud)
在我使用超级构造函数的所有其他语言中隐式调用.如何在Python中调用它?我希望,super(self)但这不起作用.
我想测试一个类是否继承自另一个类,但似乎没有一个方法.
class A
end
class B < A
end
B.is_a? A
=> false
B.superclass == A
=> true
Run Code Online (Sandbox Code Playgroud)
我想要的一个微不足道的实现是:
class Class
def is_subclass_of?(clazz)
return true if superclass == clazz
return false if self == Object
superclass.is_subclass_of?(clazz)
end
end
Run Code Online (Sandbox Code Playgroud)
但我希望这已经存在了.
为什么Python设计者决定子类的__init__()方法不会__init__()像其他语言那样自动调用超类的方法?Pythonic和推荐的成语是否真的如下?
class Superclass(object):
def __init__(self):
print 'Do something'
class Subclass(Superclass):
def __init__(self):
super(Subclass, self).__init__()
print 'Do something else'
Run Code Online (Sandbox Code Playgroud) 我正在阅读'Dive Into Python',并在关于类的章节中给出了这个例子:
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
Run Code Online (Sandbox Code Playgroud)
然后,作者说如果要覆盖该__init__方法,则必须__init__使用正确的参数显式调用父级.
FileInfo班有一个以上的祖先课怎么办?
__init__方法? 所以说我有一个扩展超类的子类.在什么情况下我需要显式键入super()以运行超类构造函数?
我正在看一本关于抽象类的书中的例子,当他们用非抽象子类扩展它时,子类的默认构造函数是空白的,并且有一个注释表明将调用超类的默认构造函数.与此同时,我也看到过这里有人问题没有明确调用的情况super().
区别于从子类的默认/非默认构造函数调用超类的默认/非默认构造函数?
假设我有一个名为的基类Entity.在那个类中,我有一个静态方法来检索类名:
class Entity {
public static String getClass() {
return Entity.class.getClass();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有另一个类扩展.
class User extends Entity {
}
Run Code Online (Sandbox Code Playgroud)
我想获得User的类名:
System.out.println(User.getClass());
Run Code Online (Sandbox Code Playgroud)
我的目标是看到"com.packagename.User"输出到控制台,但是我将最终得到"com.packagename.Entity",因为Entity类是直接从静态方法引用的.
如果这不是一个静态方法,可以通过this在Entity类中使用关键字(即:)来轻松解决return this.class.getClass().但是,我需要这种方法保持静态.有关如何处理此问题的任何建议?
如何在Dart中调用超级构造函数?是否可以调用命名的超级构造函数?
superclass ×10
inheritance ×4
java ×4
python ×4
subclass ×4
constructor ×3
class ×2
overriding ×2
super ×2
android ×1
dart ×1
delegation ×1
eclipse ×1
extends ×1
ruby ×1
typeerror ×1