什么使通用类型有所不同

问题描述 投票:0回答:2

当我在做我的项目时,我遇到了使用泛型类型的新混淆,这是对象的微妙变化。

通常,当我构造一个节点时,我声明了这样的泛型

public class HW3<E> {
    private Tree<E> treeNode = new Tree <E> ();

但现在,如果我这样做,这似乎也是正常的。

public class HW3<E> {
    private Tree<Object> treeNode = new Tree <Object> ();

所以,我真的很想知道这两者之间的区别:我将Node构造为不太可能是主类对象的Object类型的不同引用。欢迎任何形式的例子。请分享您的知识。谢谢。

java object generics
2个回答
0
投票

在需要调用代码(外部或非外部)之前,这两种结构之间的区别并不重要。

简而言之,第一个代码将允许您的呼叫者利用泛型,而第二个代码可能不会。这只是在treeNode领域。

假设您要为客户端添加一个方法来检索树/对象(完全假设):

第一个版本是:

public class HW3<E> {
    private Tree<E> treeNode = new Tree <E> ();
    public E getNodeData();

在第一种情况下,您的客户端可以使用任何通用参数调用您的代码,而不需要强制转换:

MW3<SomeType> hw3 = ...//create instance
SomeType data = hw3.getNodeData();

Java知道这一点,泛型将允许你避免强制转换。

第二个版本必须是:

public class HW3<E> {
    private Tree<Object> treeNode = new Tree <Object> ();
    public Object getNodeData(); //You would have to do this because the field with data wouldn't know about the generic type

与使用泛型的此版本不同,如果您使用了对象,则客户端必须强制转换:

MW3<SomeType> hw3 = ...//create instance
SomeType data = (SomeType) hw3.getNodeData();

换句话说,E类型参数在第二个示例中完全没用,您应该不使用它。我使用的例子假设你的Tree类型有一些通用的get方法......

有关更多信息,请查看泛型类型实现,例如java.util.ArrayList。您的代码段之间的主要区别在于您如何使用类型参数以及如何使您的呼叫者从中受益。


0
投票

当我们在类级别定义泛型类型时,我们基本上告诉java编译器我们将处理类HW3中的类型,这在定义时是未知的,即

public class HW3<E> {
  ...
}

但是根据用途得出,例如当你写作

 HW3<Integer> myHw3OfIntegers = new HW3<Integer>();
 HW3<String> myHw3OfStrings = new HW3<String>();

因此,您现在可以看到上述2个声明如何影响生成对象的treeNode字段。第一个对象myHw3OfIntegers将代表一个整数树,其中第二个对象myHw3OfStrings将代表一个字符串树。

© www.soinside.com 2019 - 2024. All rights reserved.