Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
引用一种在Java中不使用参数化类型的类型_Java_Oop - Fatal编程技术网

引用一种在Java中不使用参数化类型的类型

引用一种在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

我有一个需要维护或了解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";
}
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()