假设我有一个超类Animal,以及一个子类Dog.
我们可以说:
Animal a = new Dog();
Run Code Online (Sandbox Code Playgroud)
我们不能低声说:
Dog b = new Animal();
Run Code Online (Sandbox Code Playgroud)
所以我明白动物不一定是狗.但是,为什么在狗容器中有动物"蓝图"会抛出异常呢?因为Dog从Animal继承了方法,当我们把这种动物放入狗容器中时,我们知道Dog继承/覆盖了Animal所有的方法,那为什么Java不允许这样呢?
谢谢!
我最近一直在研究 c# 中的向上转换和向下转换。我知道向上转换是指从派生类到基类的转换。但是,当我看到向上转换的实际示例(如下所示)时,我感到困惑。
public class Shape
{
...
}
public class Circle : Shape
{
...
}
Circle circle = new Circle();
Shape shape = new Shape();
// Converting an object into its base class reference
shape = circle
Run Code Online (Sandbox Code Playgroud)
如果我们将 circle 转换为它的基类引用,它不应该像
circle = shape
Run Code Online (Sandbox Code Playgroud)
对不起,如果这听起来太业余了。这是因为我一直看到以下格式的表达式:
int x = 3; // means assign 3 to variable x.
Run Code Online (Sandbox Code Playgroud)
所以我很困惑为什么圆圈在右手边而不是在左手边。请指教。把我当作初学者。
我有一个经典的 Go nil 接口问题。
我试图断言 an interface{},我从 a 分配nil error回一个error接口。这句话很令人困惑,所以我有一个方便的例子: https: //play.golang.com/p/Qhv7197oIE_z
package main
import (
"fmt"
)
func preferredWay(i interface{}) error {
return i.(error)
}
func workAround(i interface{}) error {
if i == nil {
return nil
}
return i.(error)
}
func main() {
var nilErr error
fmt.Println(workAround(nilErr)) // Prints "<nil>" as expected.
fmt.Println(preferredWay(nilErr)) // Panics.
}
Run Code Online (Sandbox Code Playgroud)
输出:
<nil>
panic: interface conversion: interface is nil, not error
goroutine 1 [running]:
main.preferredWay(...)
/tmp/sandbox415300914/prog.go:8
main.main()
/tmp/sandbox415300914/prog.go:21 …Run Code Online (Sandbox Code Playgroud) 如何使用强运行时已知类型进行向下转换?
public class A {}
public class B : A { public int i; }
public class C
{
B b = new B();
A a = b; // here upcast, and "a" still keeps link to "b"
((B)a).i; // no problem it works
Type t = b.GetType(); // BUT how to downcast with strongly runtime known type ?
((t)a).i; // like here
}
Run Code Online (Sandbox Code Playgroud) 当我调用时a.displayName("Test"),它调用 Icecream 类的方法。displayName(String...s)方法接受可变参数。输出-
test Icecream
test Faloodeh
test Faloodeh: Faloodeh
test Faloodeh: Faloodeh
Run Code Online (Sandbox Code Playgroud)
但是当我将方法更改为displayName(String s)(我已经在代码中注释掉了该部分)时,它会调用 Faloodeh 类的方法。新输出-
test Faloodeh
test Faloodeh
test Faloodeh: Faloodeh
test Faloodeh: Faloodeh
Run Code Online (Sandbox Code Playgroud)
我想知道为什么会这样。
class Icecream{
public void displayName(String...s){
System.out.println(s[0]+" "+"Icecream");
}
/*public void displayName(String s){
System.out.println(s+" "+"Icecream");
}
*/
public void describe(String s) {
System.out.println(s+" "+"Icecream: Ice cream");
}
}
class Faloodeh extends Icecream {
public void displayName (String s){
System.out.println(s+" "+"Faloodeh ");
}
public void describe (String s) …Run Code Online (Sandbox Code Playgroud) 如何将特征向下转换为结构,就像这个 C# 示例中那样?
我有一个基本特征和几个派生结构,必须将它们推入单个基本特征向量中。
我必须检查向量的每个项目是否可转换为特定的派生结构,如果是,则将其用作该类型的结构。
这是我的 Rust 代码,我不知道如何实现注释部分。
trait Base {
fn base_method(&self);
}
struct Derived1;
impl Derived1 {
pub fn derived1_method(&self) {
println!("Derived1");
}
}
impl Base for Derived1 {
fn base_method(&self) {
println!("Base Derived1");
}
}
struct Derived2;
impl Derived2 {
pub fn derived2_method(&self) {
println!("Derived2");
}
}
impl Base for Derived2 {
fn base_method(&self) {
println!("Base Derived2");
}
}
fn main() {
let mut bases = Vec::<Box<dyn Base>>::new();
let der1 = Derived1{};
let der2 …Run Code Online (Sandbox Code Playgroud) 我正在试图看看HashSet是否是我下一个项目的解决方案,所以我正在做一些非常简单的测试来检查功能.我有一个简单的课程Klant:
public class Klant {
private int klantNummer;
public Klant(int nummer) {
this.klantNummer = nummer;
}
public int getKlantNummer() {
return this.klantNummer;
}
}
Run Code Online (Sandbox Code Playgroud)
并且通过组合的类使用a HashSet
public class MySet<Klant> {
private Collection<Klant> mySet = null;
public MySet() {
mySet=new HashSet<Klant>();
}
public void add(Klant elem) {
mySet.add(elem);
}
public void toon() {
Iterator<Klant> i = mySet.iterator();
while(i.hasNext()) {
Klant k = i.next();
System.out.println(k.);
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是在方法toon()
基本上即使我指定的迭代器将包含Klant对象<Klant>
的本地k对象不向我提供的getKlantNummer()定义mthod Klant
的k …
我有两节课:
/*Switch.h*/
class CSwitch : public CDeviceEntity {}
/*EndSystem.h*/
class CEndSystem : public CDeviceEntity {}
Run Code Online (Sandbox Code Playgroud)
但是当我使用时:
CDeviceEntity* dev = NULL;
dev = topo->headList[i]->node;
if ( DYNAMIC_DOWNCAST( CEndSystem, dev ) != NULL ) {}
Run Code Online (Sandbox Code Playgroud)
" DYNAMIC_DOWNCAST"总是返回not NULL而dev是一种class CEndSystem或者class CSwitch.
如果使用:
/*Switch.h*/
class CSwitch : public CDeviceEntity { DECLARE_DYNAMIC(CSwitch) }
and
/*Switch.cpp*/
IMPLEMENT_DYNAMIC(CSwitch, CDeviceEntity)
/*EndSystem.h*/
class CEndSystem : public CDeviceEntity { DECLARE_DYNAMIC(CEndSystem) }
and
/*EndSystem.cpp*/
IMPLEMENT_DYNAMIC(CEndSystem, CDeviceEntity)
Run Code Online (Sandbox Code Playgroud)
" DYNAMIC_DOWNCAST"返回NULL或not NULL根据 …
说我有这个:
Object obj = new Double(3.14);
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以obj像Double没有明确地使用它一样使用Double?例如,如果我想使用计算.doubleValue()方法Double.
我在swift项目中有一个方法定义:
class func fireGetRequest(urlString: String!, username: String?, password: String?, completionBlock:(NSDictionary)->Void) {
//check if user passed nil userName
if username == nil || password == nil {
// retrieve userName, password from keychain
// here we have OR check since we have single value from pair it is of no use and can be considered as corrupted data
// so it is better to retrieve stable data from keychain for further processing
let (dataDict, error) = Locksmith.loadDataForUserAccount(kKeychainUserAccountName)
// no error found …Run Code Online (Sandbox Code Playgroud)