有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否有机会使用类<?,?>我的项目?

我的代码有一些问题。 首先,我有一个界面:

public interface Generator <T, R> {
    public T next (R x);
}

然后,我创建了类“DemoClass”

public class DemoClass {
    private int id;

    public DemoClass (int id){
        this.id = id;
    }
}

而且。。。泛型类也是如此

public class GenericClass implements Generator <DemoClass, Integer> {
    public DemoClass next(Integer x) {
        return new DemoClass (x);
    }
}

之后,我创建了一个主类和一个泛型静态方法,其中包含一个类似类的方法。我想知道,有没有机会使用这样的建筑类课程??? 我的主课

import java.util.*;

public class MainClass {
    private static Random rand = new Random ();

    public static <T> T [] arr (T [] a, Class <?> typeToken){
        try{
            Generator <?, ?> gen = (Generator <?, ?>)typeToken.newInstance(); // How can I pass two paramets to Generator <?, ?>???
            for (int i=0; i!=a.length; i++){
                a[i] = (T) gen.next(rand.nextInt(100)); // This  line does not work!
            }
        } catch (Exception e){
            throw new RuntimeException (e);
        }
        return a;
}

    public static void main (String [] args){
        DemoClass [] myarr = arr (new DemoClass[10], GenericClass.class);
    }
}

共 (2) 个答案

  1. # 1 楼答案

    没有

    泛型只能在编译时工作。在运行时,类的所有实例都完全相同,参数化类型的信息消失了

    这被称为类型擦除,其设计目的是确保Java 1.4二进制文件与Java 5 VM兼容

    通过在搜索框中搜索“type erasure java”,你可以获得很多关于这方面的信息;例如Avoiding Java Type Erasure

  2. # 2 楼答案

    如果你想让这条线发挥作用,你可以这样做:

    public static <T> T[] arr(T[] a, Class<? extends Generator<T, Integer>> typeToken) {
        try {
            Generator<T, Integer> gen = typeToken.newInstance();
            for (int i = 0; i != a.length; i++) {
                a[i] = gen.next(rand.nextInt(100));
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return a;
    }
    

    基本上,Class上的界使得newInstance返回的是Generator<T, Integer>

    How can I pass two paramets to Generator ???

    不需要传递任何类型参数。因为Java泛型使用擦除,所以在运行时不需要具体的泛型类型参数


    如果您使用的是Java 8,我建议使用Supplier而不是Class,因为它允许您创建实例,而不必处理异常:

    public static <T> T[] arr(T[] a, Supplier<? extends Generator<T, Integer>> typeToken) {
        Generator<T, Integer> gen = typeToken.get();
        for (int i = 0; i != a.length; i++) {
            a[i] = gen.next(rand.nextInt(100));
        }
        return a;
    }
    

    // passing reference to constructor of GenericClass
    DemoClass[] myarr = arr(new DemoClass[10], GenericClass::new);