为什么接口允许所有类?
例如,我有以下代码:
interface I1 { }
class C1 { }
public class Test{
public static void main(String args[]){
C1 o1 = new C1();
I1 x = (I1)o1; //compiler compile its successfully but failed in run time
}
}
我知道为什么它在运行时失败,因为C1类没有实现I1接口。如果类C1实现了I1,那么上面的代码将会成功工作。
有人能解释为什么接口允
我的问题是,既然new Test()既不是String的子类,也不是字符串本身,那么为什么instanceof编译失败?它不应该返回false吗。
public class Test{
public static void main(String[] args) {
//Compiles fails
System.out.println(new Test() instanceof String);
//compiles fine but run time class cast exception.
Test
在下面,我有一个泛型函数fun <T : Number> sum(list : List<T>) : T,它有一个类型参数T : Number。
在函数中,我将列表的数字求和为sum : Double,最后用return sum as T表示和。
例如,如果传递了一个Int列表,我也会得到一个Int --这是可行的。
fun <T : Number> sum(list : List<T>) : T {
var sum = 0.0
for(x in list)
sum += x.toDouble()
retu
我希望这段代码抛出一个ClassCastException:
public class Generics {
public static void main(String[] args) {
method(Integer.class);
}
public static <T> T method(Class<T> t) {
return (T) new String();
}
}
但事实并非如此。将字符串转换为T不会失败,除非我以某种方式使用返回的对象,例如:
public class Generics {
下面是一个代码片段:
import java.util.*;
class Test
{
public static void main(String[] args)
{
List<Integer> list = new ArrayList<>();
addToList(list);
Integer i = list.get(0); //#1 fails at run-time
String s = list.get(0); //#2 fails at compile-time
我对下面这段代码有一些问题。我想显式的字符串到一个对象,这是非常好的工作,但是,如果这个对象是一个泛型类的一部分,这是失败的,并出现以下错误异常:"Unable to cast object of 'System.String‘to type 'test.B'“。即使我重载了这个方法。
using System;
using System.Collections.Generic;
namespace test {
class Program {
static void Main(string [] args) {
查看以下类的主要方法:
public class Outer {
static class A<T> {
public A<T> a;
public T t;
public A() { a = null; }
public A(T t) {
a = (A<T>) new B();
a.t = t;
}
}
static class B extends A<Integer> {}
pu
我发现,在ActionScript中,将日期转换为日期并将其赋给日期类型的变量会抛出TypeError:
var date : Date = Date(new Date(2012, 01, 01));
Error #1034: Type Coercion failed: cannot convert "Wed Aug 22 17:06:54 GMT+1000 2012" to Date.
这显然是错误的,但我想知道为什么会发生这种情况。我的理论是,日期转换,就像数字转换一样,已经被覆盖,试图转换给定的类型,而不仅仅是转换它。
有趣的是,将其他任何内容转换为日期并将其分配给日期
为什么要编译下面的代码?
如果参数是接口而不是泛型的超接口,为什么允许将泛型列表强制转换为其类型参数?
这是什么意思?
//Connection can be substituted by any interface
List<Connection> list = null;
Connection c = (Connection) list;
假设你有一个像这样干净的班级:
public class A {
// Stuff
}
像这样的界面:
public interface G {
// Stuff
}
为什么我可以这么做:
A a = new A();
((G) a) // No errors thrown
我不明白为什么在A类和接口G之间没有任何关系的情况下,应该能够将它们转换成接口G。有人能给我解释一下吗?
跟进。如果我做以下几点:
public class C implements G {
// Stuff
}
这将不会编译:
((C) a)
实现接口的类和仅仅实现接口的类之间有什么区别?
编辑
我正在准备Java 7认证,并有以下问题。
Byte b = 10编译正常。看起来编译器正在将int 10缩小到字节10,然后对其进行装箱。为什么Byte b = new Byte(10)不能编译?为什么编译器不能像在第一种情况下那样将int 10缩小到字节10呢?
另外,为什么Long l = new Long(10)编译正常,但Long l = 10失败?
我不清楚这是如何工作的。有人能给出一个清晰的解释吗?
在C#中,环境提供了以下类型:
public interface IFoo {
}
public abstract class Base {
}
public class Derived : Base, IFoo {
}
public class Arbitrary {
public Base GetBase() { }
}
除了这个,我还写了些什么。注意,我可以在代码中保证Arbitrary.GetBase()总是返回Derived的一个实例。
public class Arbitrary2 : Arbitrary {
public IFoo GetDerived()
使用嵌套泛型时,编译器在直接使用时会失败,但在使用约束时可以正确编译。
示例:
public static void Test1<V, E>(this Dictionary<V, E> dict)
where V : IVertex
where E : IEdge<V>
{}
public static void Test2(this Dictionary<IVertex, IEdge<IVertex>> dict){}
上面的两个扩展方法表面上具有相同的签名,但如果我现在尝试运行以下代码:
var dict = n
class Animal{
public void findAnimal(){
System.out.println("Animal class");
}
public void sayBye(){
System.out.println("Good bye");
}
}
class Dog extends Animal{
public void findAnimal(){
System.out.println("Dog class");
}
}
鉴于上面的继承,可以理解,Animal的引用可以引用Dog的
为什么我的指针的static_cast失败?
int iDog = 456;
int *piDog = &iDog;
long *plDog = static_cast<long*>(piDog); // invalid type conversion
long lDog = static_cast<long>(iDog); // ok
long* plDog = (long*)(piDog); // this is OK too... very weird!! (Dynamic cast... and we aren't allowed to
假设我有这些:
class Animal {
}
class Cat: Animal {
var meow = "meow"
}
现在我有了一个变量:
var catMaybe: Cat? = /* ... */
在以后的某个时刻,我会这样做:
var obj1 = catMaybe as Animal? // ①
它编译得很好,但我也可以写下其他代码:
var obj2 = catMaybe as? Animal // ②
只是这一次我得到了警告。这让我很困惑,因为我以为两者都在做同样的事情。
warning: cast from 'Cat?' to
这个kotlin代码:
fun badKotlin(text: String?): Boolean {
if (text == null) {
return true
}
var temp = text
if (false) {
temp = Arrays.deepToString(arrayOf(text))
}
return temp.isBlank() // <-- only safe (?.) or non null asserted (!!.) calls
}
不使用消息进行编译:only s
考虑下面的场景。
我有一个返回ISomething的方法,但可能是Something或Wrapped<Something>。因此,我将结果传递给Something来使用它,但是它失败了,任何关于为什么或者如何解决它的帮助都是非常感谢的。
class Program
{
static void Main(string[] args)
{
var a = new DerivedSomething();
var b = (DerivedSomething)new Wrapped<DerivedSomething>(a); //s
我有一个匿名类型的数组,声明为:
var list = new[]
{
new {Name = "A", Age = 10},
new {Name = "B", Age = 15}
}
现在list继承自实现IEnumerable的类型数组。为什么以下操作会失败:
Convert.ChangeType(list, typeof(IEnumerable));
这也会失败:
Convert.ChangeType(list, typeof(Array));
致以亲切的问候,
因此,我在研究一些OCAJP JAVA样例问题时,偶然发现了以下问题。
考虑下面的代码。
interface I{ }
class A implements I{ }
class B extends A { }
class C extends B{ }
和以下声明:
A a = new A();
B b = new B();
哪一个可以编译并运行而不会出错?
A. a = (B)(I)b;
B. b = (B)(I) a;
C. a = (I) b;
D. I i = (C) a;
这个问题的答案是A,这是有道理的。我不明白的是,B不是正确的答案。它说这是不正确的选择,因为“这将在运行
为什么在这个片段中,虽然Tree接口与Bug类无关,但它不会产生编译时异常?
interface Tree {}
class Bug {
public static void main(String[] args) {
Bug bug = new Bug();
Tree tree = (Tree) bug;
}
}