【问题标题】:Can you use primitive types for generic parameters in a class or method?您可以在类或方法中使用原始类型作为泛型参数吗?
【发布时间】:2014-02-21 02:54:02
【问题描述】:

我正在写一篇关于泛型的简短论文,但我并没有真正在 Java 中大量使用它们。我想知道原始类型是否可以用作泛型变量中的参数类型。我无法使用泛型类型的泛型参数对其进行编译。

问题:我不太确定泛型如何处理原始数据类型。有人可以举例说明我必须如何声明不同的方法,而不必使用 Integer 向 int 类型添加强制转换,以及是否可以在类声明中使用原始 Java 数据类型

   DDHGeneric<int,int,int,int> t = new DDHGeneric<int,int,int,int>();

有没有办法做到这一点?

以下声明也无法编译。我确实知道,根据我对泛型的了解,使用原始数据类型和用户定义的类之间是有区别的。

   DDHGeneric<int, int, int, int> temp2 = new  DDHGeneric<int, int, int, int>();

类:

public class DDHGeneric<T,K,Bigfoot,Pizza> {
    T a;
    K n;
    Bigfoot u;

    public DDHGeneric() {
    }

    private <rapper> void myMethod(rapper y) {
    int temp = y; <--Errors out on this line as will.
}

    public <Pizza> void myAddition(Pizza a, Pizza b) {
    }

    private <K> void me(K a, K b, K c) {
    }

    public static void main(String[] args) {
         DDHGeneric<int, Integer, Integer, Integer> temp = new  DDHGeneric<int, Integer, Integer, Integer>();
         temp.myAddition(5, 4);
         temp.a = "Test this string!" ;
    }
}

【问题讨论】:

  • 答案是你不能。
  • 你不能,因为基元没有通用的表示。所有对象都有一个共同的表示——一个对象引用指针——所以可以在编译泛型的实现之后设置类型。

标签: java


【解决方案1】:

你不能。

Oracle 给了an article on this topic

引用:

创建 Pair 对象时,不能用原始类型替换类型参数 K 或 V:

Pair&lt;int, char&gt; p = new Pair&lt;&gt;(8, 'a'); // compile-time error

您只能用非原始类型替换类型参数 K 和 V:

Pair&lt;Integer, Character&gt; p = new Pair&lt;&gt;(8, 'a');

【讨论】:

    【解决方案2】:

    没有。

    泛型并不代表原语。它们旨在表示对象(作为泛型类型all extend Object implicitly)。

    您可以使用您想要的原始类的包装器变体来实现相同的效果。

     DDHGeneric<Integer, Integer, Integer, Integer> t = new DDHGeneric<>();
    

    以下是来自Why Use Generics? 的简短摘录,可在 Java Trails 中找到:

    简而言之,泛型使类型(类和接口)在定义类、接口和方法时成为参数。

    【讨论】:

    • 谢谢。这两个都是非常好的答案。我总是很难决定接受谁的答案。对于这类工作,人们是否遵循任何硬性规定。
    • @DougHauf 不,只是选择一个答案。在这种情况下,我建议与第一个回答的人一起去;)
    【解决方案3】:

    泛型只接受原始类,而不接受原始数据类型。

    对于每种数据类型都使用其对应的类

    DDHGeneric&lt;int,int,int,int&gt; t = new DDHGeneric&lt;int,int,int,int&gt;();

    可以作为

    DDHGeneric&lt;Integer, Integer, Integer, Integer&gt; t = new DDHGeneric&lt;Integer, Integer, Integer, Integer&gt;();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多