引用一种在Java中不使用参数化类型的类型
我有一个需要维护或了解has的类,它引用了其他三种类。提供此类参考的最佳方式是什么引用一种在Java中不使用参数化类型的类型,java,oop,Java,Oop,我有一个需要维护或了解has的类,它引用了其他三种类。提供此类参考的最佳方式是什么 class Hello<T extends IsLetter> { private T refOtherClass; } // getter and setter for refOtherClass here interface IsLetter {} class A implements IsLetter { private String a = "A data"; } clas
class Hello<T extends IsLetter> {
private T refOtherClass;
}
// getter and setter for refOtherClass here
interface IsLetter {}
class A implements IsLetter {
private String a = "A data";
}
class B implements IsLetter {
private String b = "B data";
}
提示?您当然可以使用强制类型转换:
A a = (A) hi.getRefOtherClass();
泛型在此所做的是将此强制转换的验证移到早期阶段—编译时。如果不使用泛型,并且尝试强制转换为错误的类型,则在运行时会出现错误
在这种情况下,您需要使用具体类型。如果接口名为justletter的函数拥有所有的方法,只需让方法返回Letter并使用接口即可
您可以通过调用object.getClass来获得对象的确切类,或者使用if子句,比如if a的instanceof a您糟糕的解释可能没有得到任何答案。但我想这是你要问的一个问题 因此,首先您需要这样做:
Hello<A> hi = new Hello<A>();
最后,您应该在界面上放置一个方法,如下所示:
interface IsLetter{ String getValue();}
当然,你可以做一个.getValue;由于OO的美妙之处,您可以从B返回B值或从A返回A值。我不清楚您为什么要在没有泛型的情况下执行此操作-这正是泛型更清楚的情况:
class Hello<T extends IsLetter> {
public T getRefOtherClass(){ ... }
}
class A implements IsLetter { ... }
class B implements IsLetter { ... }
Hello hi = new Hello<A>();
A a = hi.getRefOtherClass();
您只能通过强制转换get方法的输出(即messier)来摆脱参数化,或者通过对Hello进行子类化来将参数化封装在子类化中,这在某些情况下可能是有意义的,尽管在像这样的简单示例中不是这样
class HelloA extends Hello<A> {...
A a = new HelloA.get()
但同样,你并没有摆脱仿制药,你只是在改变它们。他似乎知道这一点,并在问如果没有仿制药怎么做啊,我没看到这一部分。现在你为什么要这么做:因为A和B其实并不相似,只是Hello可以引用它们。所以我不能在接口中添加getValue,GetOtherBlaBlaBlaBla,因为它们两个或更多可能都不提供这样的值和其他BlaBlaBla。你们在那个里失去了我。可能是因为您认为必须实现一个接口才能使用泛型。但事实并非如此。你可以在课堂上打招呼{}。尝试再次提问,因为您应该尝试使用泛型。他们是你的朋友。是的,但我不想。我怎么知道getRefOtherClass实际上是类型A而不是类型B?这就是我要问的。如何知道引用指向什么,并在必要时将其转换为引用,也许我应该使用instanceof?@AntonioP如果你在编译时不知道它,那么在运行时你想对它做什么?我想我们会感到困惑,因为你问的问题并不正确。我明白了,这是一个好问题。我会再考虑一下。谢谢你们两位!
class Hello<T extends IsLetter> {
public T getRefOtherClass(){ ... }
}
class A implements IsLetter { ... }
class B implements IsLetter { ... }
Hello hi = new Hello<A>();
A a = hi.getRefOtherClass();
class HelloA extends Hello<A> {...
A a = new HelloA.get()