这是我刚刚遇到的一个很好的陷阱.考虑一个整数列表:
List<Integer> list = new ArrayList<Integer>();
list.add(5);
list.add(6);
list.add(7);
list.add(1);
Run Code Online (Sandbox Code Playgroud)
对你执行时会发生什么的任何有根据的猜测list.remove(1)?怎么样list.remove(new Integer(1))?这可能会导致一些令人讨厌的错误.
在处理整数列表时,区分remove(int index)哪个元素从给定索引remove(Object o)中删除元素以及通过引用删除元素的正确方法是什么?
来自C++背景;)
如何重载PHP函数?
一个函数定义是否有任何参数,另一个函数定义没有参数?在PHP中有可能吗?或者我应该使用if else来检查是否有从$ _GET和POST传递的参数?和他们联系?
我知道Python不支持方法重载,但我遇到了一个问题,我似乎无法以一种漂亮的Pythonic方式解决这个问题.
我正在制作一个角色需要射击各种子弹的游戏,但是如何编写不同的功能来制作这些子弹呢?例如,假设我有一个函数可以创建一个以给定速度从A点到B点行进的子弹.我会写一个这样的函数:
def add_bullet(sprite, start, headto, speed):
... Code ...
Run Code Online (Sandbox Code Playgroud)
但我想写其他功能来创建子弹,如:
def add_bullet(sprite, start, direction, speed):
def add_bullet(sprite, start, headto, spead, acceleration):
def add_bullet(sprite, script): # For bullets that are controlled by a script
def add_bullet(sprite, curve, speed): # for bullets with curved paths
... And so on ...
Run Code Online (Sandbox Code Playgroud)
等等有很多变化.有没有更好的方法来做到这一点,而不使用这么多的关键字参数导致它快速变得有点难看.重命名每个功能,因为你要么是非常糟糕过add_bullet1,add_bullet2或add_bullet_with_really_long_name.
要解决一些问题:
不,我无法创建Bullet类层次结构,因为它太慢了.管理项目符号的实际代码在C中,我的函数是围绕C API的包装器.
我知道关键字参数,但检查各种参数组合变得烦人,但默认参数有助于分配 acceleration=0
我试图在Python中实现方法重载:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow(2)
Run Code Online (Sandbox Code Playgroud)
但输出是second method 2; 类似的:
class A:
def stackoverflow(self):
print 'first method'
def stackoverflow(self, i):
print 'second method', i
ob=A()
ob.stackoverflow()
Run Code Online (Sandbox Code Playgroud)
给
Traceback (most recent call last):
File "my.py", line 9, in <module>
ob.stackoverflow()
TypeError: stackoverflow() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
我该如何工作?
对此可能有一个简单的答案......但它似乎在逃避我.这是一个简化的例子:
public class Person
{
public string SocialSecurityNumber;
public string FirstName;
public string LastName;
}
Run Code Online (Sandbox Code Playgroud)
让我们说,对于这个特定的应用程序,如果社会安全号码匹配,并且两个名称都匹配,那么我们指的是同一个"人"是有效的.
public override bool Equals(object Obj)
{
Person other = (Person)Obj;
return (this.SocialSecurityNumber == other.SocialSecurityNumber &&
this.FirstName == other.FirstName &&
this.LastName == other.LastName);
}
Run Code Online (Sandbox Code Playgroud)
为了保持一致,我们还为团队中不使用该.Equals方法的开发人员覆盖==和!=运算符.
public static bool operator !=(Person person1, Person person2)
{
return ! person1.Equals(person2);
}
public static bool operator ==(Person person1, Person person2)
{
return person1.Equals(person2);
}
Run Code Online (Sandbox Code Playgroud)
好又花花公子,对吧?
但是,当Person对象发生时会发生什么null?
你不能写:
if (person == null)
{
//fail! …Run Code Online (Sandbox Code Playgroud) 虽然可能存在这样的方法过载可能变得模糊的有效情况,但为什么编译器不允许在编译时和运行时都不模糊的代码?
例:
// This fails:
def foo(a: String)(b: Int = 42) = a + b
def foo(a: Int) (b: Int = 42) = a + b
// This fails, too. Even if there is no position in the argument list,
// where the types are the same.
def foo(a: Int) (b: Int = 42) = a + b
def foo(a: String)(b: String = "Foo") = a + b
// This is OK:
def foo(a: String)(b: Int) = a + b …Run Code Online (Sandbox Code Playgroud) 据我所知,Objective-C不支持方法重载.在Objective-C中可以替代什么?或者我应该总是使用不同的方法名称?
我添加了三个带参数的方法:
public static void doSomething(Object obj) {
System.out.println("Object called");
}
public static void doSomething(char[] obj) {
System.out.println("Array called");
}
public static void doSomething(Integer obj) {
System.out.println("Integer called");
}
Run Code Online (Sandbox Code Playgroud)
当我调用时doSomething(null),编译器会将错误视为模糊方法.所以是问题,因为Integer和char[]方法,或Integer和Object方法呢?
在PHP中,你的意思是函数重载和函数重写.它们两者有什么区别?无法弄清楚它们之间有什么区别.
根据文档,该方法String.valueOf(Object obj)返回:
如果参数是
null,那么一个字符串等于"null"; 否则,obj.toString()返回值.
但是当我尝试这样做时怎么样:
System.out.println("String.valueOf(null) = " + String.valueOf(null));
Run Code Online (Sandbox Code Playgroud)
它会引发NPE而不是?(如果你不相信,请亲自尝试!)
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.(Unknown Source)
at java.lang.String.valueOf(Unknown Source)
怎么会发生这种情况?文档对我说谎吗?这是Java中的一个主要错误吗?
overloading ×10
java ×3
null ×3
php ×2
python ×2
.net ×1
api-design ×1
arguments ×1
c# ×1
class ×1
collections ×1
default ×1
ios ×1
methods ×1
objective-c ×1
oop ×1
overriding ×1
scala ×1