自动装箱是Java编译器在基元类型和相应的对象包装类之间进行的自动转换.例如,将int转换为Integer,将double转换为Double,依此类推.如果转换是另一种方式,则称为拆箱.
那么为什么我们需要它呢?为什么我们在Java中使用自动装箱和拆箱?
我在CodeGolf上看到了一段代码,它的目的是作为编译器炸弹,其中main
声明为一个巨大的数组.我试过以下(非炸弹)版本:
int main[1] = { 0 };
Run Code Online (Sandbox Code Playgroud)
它似乎在Clang下编译得很好,并且在GCC下只有一个警告:
警告:'main'通常是一个函数[-Wmain]
结果二进制文件当然是垃圾.
但为什么它会编译呢?是否允许C规范?我认为相关的部分说:
5.1.2.2.1程序启动
程序启动时调用的函数名为main.该实现声明此函数没有原型.它应定义为返回类型为int且没有参数[...]或具有两个参数[...]或以某种其他实现定义的方式.
"其他一些实现定义的方式"是否包含全局数组?(在我看来,规范仍然指的是一个函数.)
如果没有,它是编译器扩展吗?或者工具链的一个功能,它可以用于其他目的,他们决定通过前端提供它?
我在.ΝΕΤ上读过一些关于泛型的信息,并注意到一件有趣的事情.
例如,如果我有一个泛型类:
class Foo<T>
{
public static int Counter;
}
Console.WriteLine(++Foo<int>.Counter); //1
Console.WriteLine(++Foo<string>.Counter); //1
Run Code Online (Sandbox Code Playgroud)
两类Foo<int>
,并Foo<string>
在运行时不同.但是具有泛型方法的非泛型类呢?
class Foo
{
public void Bar<T>()
{
}
}
Run Code Online (Sandbox Code Playgroud)
很明显,只有一个Foo
班级.但是方法Bar
怎么样?所有泛型类和方法都在运行时使用它们使用的参数关闭.这是否意味着类Foo
有许多实现,Bar
并且有关此方法的信息存储在内存中?
我试图从a中删除元素List
并获取java.lang.UnsupportedOperationException
.
public <T extends Object> void findDuplicates(
String title, Multimap<T, ChunkId> map) {
for (T key : map.keySet()) {
Collection<ChunkId> ids = map.get(key);
List<ChunkId> idList = (Arrays.asList(ids.toArray(new ChunkId[0])));
removeUsedIds(idList);
Collections.sort(idList);
//...
}
}
private void removeUsedIds(List<ChunkId> idList) {
// decrement counter to avoid indexing changed parts of list
for (int i = idList.size() - 1; i >= 0; i--) {
if (usedIdSet.contains(idList.get(i))) {
idList.remove(i); // **** Exception thrown here
}
}
}
Run Code Online (Sandbox Code Playgroud)
我明白了
Exception in thread …
Run Code Online (Sandbox Code Playgroud) 在做一些几乎完全无关紧要的事情时,一个问题突然出现在我脑海中:
obj.GetType().IsInterface
在仅由C#代码组成的代码库中,表单的表达式是否真实?
我怀疑答案是否定的,因为:
GetType()
将始终返回运行时类型.[ComImport, CoClass(typeof(MyClass))]
一个接口上使它看起来像您可以实例,但构造函数调用实际实例引用的类.我想不出任何其他情况.我错过了什么,或者我猜对了吗?
有过载Convert.ToInt32
的是采用Int32
作为参数.但即使文档说基本没有任何反应,该方法返回其输入.
问题是为什么我们有这样的超负荷?有什么目的吗?谁能给我一个使用这种方法的例子?
我的想法:我认为我们可能拥有它,因为有一个重载需要Object.因此我们想要消除拳击等.但我不确定.
我在C编程方面有一些经验,但我不敢称自己精通.最近,我遇到了以下宏:
#define CONST(x) (x)
Run Code Online (Sandbox Code Playgroud)
我发现它通常用于表达式,例如:
double x, y;
x = CONST(2.0)*y;
Run Code Online (Sandbox Code Playgroud)
完全被这个宏的观点困惑,我广泛研究了宏的优点/缺点和属性,但我仍然无法弄清楚这个宏的用途是什么.我错过了什么吗?
只是想知道编译代码的原因是这样的:
class MyClass extends AnotherClass {
{
MySecondClass object = new MySecondClass();
object.doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
这个代码和构造函数中的代码有什么区别?此代码在对象创建之前执行.
共享布局视图可以有控制器吗?
我需要从Controller传递模型信息吗?
或者我在这里遗漏了什么?
在任何人说什么之前我只是出于好奇而问这个问题; 我不打算根据这个答案做任何过早的优化.
我的问题是关于使用反射和铸造的速度.标准的说法是"反思很慢".我的问题是哪个部分确实很慢,为什么; 特别是在比较某事物是否是另一个实例的父母时.
我非常有信心只是将对象的类与另一个Class对象进行比较的速度与任何比较一样快,大概只是直接比较已经存储在Object状态中的单例对象; 但如果一个班级是另一个班级的父母呢?
我通常认为instanceof
它与普通班级检查一样快,但今天我想到了它,似乎有些反思必须在"幕后" instanceof
才能发挥作用.我在网上查了一下,发现有人说的instanceof
很慢; 大概是因为比较物体的父母所需的反射?
这导致了下一个问题,如何只是铸造.如果我把某事物作为一个物体,那我就得不到了ClassCastException
.但是如果将对象转换为自身的父对象,则不会发生这种情况.基本上我正在做一个instanceof
电话,或逻辑到那个效果,当我在运行时进行演员表明我不是吗?我从来没有听到过任何人暗示过投射物体之前可能会很慢.不可否认,并非所有演员都是提供对象的父级,但很多演员都是父类.然而,从来没有人暗示这可能会很慢.
那是哪个呢.是instanceof
真的没有那么慢?两者都instanceof
投射到父类有点慢吗?或者有什么理由可以比instanceof
电话更快地完成演员表?
java ×4
c# ×3
.net ×2
c ×2
asp.net-mvc ×1
autoboxing ×1
casting ×1
clang ×1
gcc ×1
generics ×1
instanceof ×1
macros ×1
optimization ×1
reflection ×1