super().__new__()在元类中重写时调用__new__包含以下函数签名:
class MyMeta(type):
def __new__(cls, name, bases, classdict):
clsobj = super().__new__(cls, name, bases, classdict)
Run Code Online (Sandbox Code Playgroud)
然而,当__new__在普通类中重写时,我们有以下内容:
class A:
def __new__(cls, *a, **kw):
clsobj = super().__new__(cls)
Run Code Online (Sandbox Code Playgroud)
将任何其他参数传递给super()inA.__new__将导致以下错误:
TypeError: object.__new__() takes exactly one argument (the type to instantiate)
Run Code Online (Sandbox Code Playgroud)
据我所知,在第二种情况下,我们正在处理object.__new__,而在第一种情况下,我们正在处理type.__new__。
我的问题是,为什么这些函数签名不同?为什么object.__new__只接受cls?
我有以下类型的超类/子类设置:
class SuperClass(object):
def __init__(self):
self.do_something() # requires the do_something method always be called
def do_something(self):
raise NotImplementedError
class SubClass(SuperClass):
def __init__(self):
super(SuperClass, self).__init__() # this should do_something
def do_something(self):
print "hello"
Run Code Online (Sandbox Code Playgroud)
我希望SuperClass init始终调用一个尚未实现的do_something方法.我正在使用python 2.7.也许ABC可以做到这一点,但它有另一种方式吗?
谢谢.
我尝试编写自己的loader-class来加载一个加密类.
因此我也覆盖了loader(ClassLoader paramClassLoader, File paramFile)调用的构造super(new URL[] { paramFile.toURI().toURL() }, paramClassLoader);.
调用".toUrl()"可以抛出一个MalformedURLException,所以编译以下代码......
public class loader extends URLClassLoader {
public static void main(String[] args)throws Exception{
Object localObject =
new loader(loader.class.getClassLoader(),
new File(loader.class.getProtectionDomain().getCodeSource()
.getLocation().getPath())
);
(...)
}
private loader(ClassLoader paramClassLoader, File paramFile){
super(new URL[] { paramFile.toURI().toURL() }, paramClassLoader);
if (paramClassLoader == null)
throw new IllegalArgumentException("Error loading class");
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
loader.java:123: error: unreported exception MalformedURLException; must be caught or declared to be thrown
super(new URL[] { paramFile.toURI().toURL() …Run Code Online (Sandbox Code Playgroud) So I've looked around for an answer to this error but nothing exact has come up. I'm new to Java and Netbeans and everything I've done so far has been on BlueJ. When I extend a class to another class the variables and methods should be inherited but I keep getting a variable not found error. This is the super class:
package Runner2D;
import java.awt.*;
public class Block {
protected boolean power;
public int width;
public int height;
public int …Run Code Online (Sandbox Code Playgroud) @Override
public void onBackPressed()
{
// ...
dialog.setPositiveButton(getText(R.string.yes), new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
super.onBackPressed();
}
});
}
Run Code Online (Sandbox Code Playgroud)
在线给我错误super,我完全理解为什么.但我该如何解决呢?
使用finish()和super.finish()Java 之间的主要区别是什么?什么时候可以/应该使用一个而不是另一个?
当我们使用this/super来调用类的任何非静态成员时,JVM会为相应的类创建任何对象.
如果我使用'super'更改超类中的任何非静态变量,这种变化也会反映在子类中.
class A
{
int i;
}
class Test extends A {
void test()
{
super.i = 10;
this.i = 8;
System.out.println("super.i = " + super.i);
System.out.println("this.i = " + this.i);
}
public static void main(String[] args) {
Test obj = new Test();
obj.test();
}
}
Run Code Online (Sandbox Code Playgroud) 我有Java 8泛型问题.
我有以下类层次结构:
Employee is base class
Manager extends Employee
Executive extends Manager
Run Code Online (Sandbox Code Playgroud)
以下第(1)行无法编译:
(1) List<? super Manager> foos1 = new ArrayList<Executive>(); // error
Run Code Online (Sandbox Code Playgroud)
以下第2行和第3行编译好了:
(2) List<? super Manager> foos2 = new ArrayList<Manager>();
(3) List<? super Manager> foos3 = new ArrayList<Employee>();
Run Code Online (Sandbox Code Playgroud)
但是,即使我仍然可以像这样添加Executive:
(4) foos2.add(new Manager("Manager!",123));
(5) foos3.add(new Executive("Executive!",1.0,2));
Run Code Online (Sandbox Code Playgroud)
请解释为什么我不能分配变量的逻辑
<? super Manager> = ArrayList<Executive>
Run Code Online (Sandbox Code Playgroud)
哪个Executive是Manager的超级管理员,但我仍然可以将Executive对象添加到数组列表中?
非常感谢!
我在学习JavaScript的第3天.我遇到了这段代码:
class B {
constructor(name) {
this.name = name;
}
printn() {
return this.name;
}
}
class A extends B {
constructor(name, age) {
super(name);
this._age = age;
}
get age() {
return this._age;
}
printName(){
return super.printn();
}
}
let c = new A("Testing", "37");
Console.log(c.printn());
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这段代码的作用.什么是构造函数和super()关键字.我相信这是为了继承?我让谷歌找到了一些东西,但这似乎是最简单的例子,但很少有人参考.
我无法使用此代码.
这是我的基类:
@Service
public class BasicUserManagerService implements UserManager {
@Autowired
private UserRepository UserRepository;
private Logger logger = LoggerFactory.getLogger(UserManagerPasswordController.class);
@Override
public void createUser(User User) {
if (UserRepository.findByEmail(User.getEmail()) != null)
throw new InvalidDataException("User already registered with this email address");
UserRepository.save(User);
logger.info("Created user: {}", User.getEmail());
}
}
Run Code Online (Sandbox Code Playgroud)
我试图扩展这个类如下:
@Service
public class UserManagerService extends BasicUserManagerService implements UserManager {
@Override
public void createUser(User User) {
super().createUser(User);
}
}
Run Code Online (Sandbox Code Playgroud)
但我一直得到的错误是对super()的调用必须是构造函数体中的第一个语句.正如你所看到的,我没有构造函数,即使我添加它,我也会得到同样的错误.为什么会发生这种情况,我该如何避免呢?
super ×10
java ×7
android ×2
inheritance ×2
python ×2
subclass ×2
abc ×1
class ×1
constructor ×1
difference ×1
ecmascript-6 ×1
exception ×1
generics ×1
init ×1
interface ×1
javascript ×1
metaclass ×1
methods ×1
netbeans ×1
python-3.7 ×1
spring-boot ×1
this ×1
wildcard ×1