2014-09-26 29 views
1

我有一个基类这样的:如何在强制强制转换受保护对象的超类时抛出警告?

class Base { 
    protected Object a; 

    Base(Object a) { 
     this.a = a; 
    } 
} 

,然后,一个daugher类:

class Daugher extends Base { 
    /* 
    ... some attributes .... 
    */  

    Daughter(Pair<L, R> a) { 
     super(a); 

    /* 
    .... some methods .... 
    */ 

    public void mathodX() { 

     .... 
     ((Pair <L, R>) a).getLeft().SomeSpecificMethodOfObjectTypeL() 
     .... 
    } 

} 

注:对具体为org.apache.commons.lang3.tuple.Pair对象,但我想同样适用于其他结构,如地图,列表等...

因此,如果我想使用强制对象类型的特定方法,我不得不做上述的丑陋铸造。 但是,这个转换会在Eclipse中引发“未经检查的转换”警告,所以它不太好。 如果我尝试插入一个支票(例如“if(一个对的实例)”等)...我被告知我不能使用instanceof检查与特定的任务,但我应该检查与Pair。但是这不会毫无意义,因为那么我想要达到L(或R)特有的方法吗?

从更广泛的意义上讲,在超类中操纵受保护的通用对象的最正确方法是什么?

我很抱歉如果没有以最好的方式说明问题,我不是Java专业人员。

感谢您的帮助!

+0

实际上,你可以不知道肯定'了'是'对'。既然它不是最终的,它可能已经被改变了,你知道,编译器是正确的,可以警告你。 – resueman 2014-09-26 14:03:08

+0

是的,我理解你的观点,我明白为什么编译器会提出警告 - 我只是想知道检查对象a是否是Pair 的一个实例是最正确的方法。 – CaptainPhlegm 2014-09-26 14:51:25

回答

5

一条路可走的是使用泛型:

class Base<T> { 
    protected T a; 

    Base(T a) { 
     this.a = a; 
    } 
} 

class Daugher<L, R> extends Base<Pair<L, R>> { 
    Daugher (Pair<L, R> a) { 
     super (a); 
    } 
} 
+0

这工作很好,谢谢! – CaptainPhlegm 2014-09-29 08:05:51

2

添加注释

@SuppressWarnings("unchecked") 

到你的方法或抑制这种类型的警告

+0

这实际上是Eclipse建议做的事情,但看起来像是对我的不良编程行为的掩饰:( – CaptainPhlegm 2014-09-26 14:54:01

0

是的,你能做到以上或你可以用不同的方式声明methodx。

public <L,R> void methodX{ 

} 

然后,编译器强制执行该类型。

退房generic programming

+0

Tnx,将检查出来! – CaptainPhlegm 2014-09-26 14:55:18

相关问题