首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有机会在我的项目中使用Class <?,?>?

有没有机会在我的项目中使用Class <?,?>?
EN

Stack Overflow用户
提问于 2017-06-12 03:01:31
回答 2查看 62关注 0票数 1

我的代码有一些问题。首先,我有一个接口:

代码语言:javascript
运行
复制
public interface Generator <T, R> {
    public T next (R x);
}

然后,我创建了类"DemoClass“

代码语言:javascript
运行
复制
public class DemoClass {
    private int id;

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

还有..。泛型类也一样

代码语言:javascript
运行
复制
public class GenericClass implements Generator <DemoClass, Integer> {
    public DemoClass next(Integer x) {
        return new DemoClass (x);
    }
}

之后,我创建了Main Class和一个通用的静态方法,其中包含一个类似Class的方法。我想知道,有没有机会使用像Class这样的结构?我的MainClass

代码语言:javascript
运行
复制
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);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2017-06-12 03:39:53

如果你想让这行工作,你可以这样做:

代码语言:javascript
运行
复制
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>

如何将两个参数传递给生成器?

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

如果您使用的是Java8,我建议您使用Supplier而不是Class,因为它允许您在不处理异常的情况下创建实例:

代码语言:javascript
运行
复制
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;
}

..。

代码语言:javascript
运行
复制
// passing reference to constructor of GenericClass
DemoClass[] myarr = arr(new DemoClass[10], GenericClass::new);
票数 0
EN

Stack Overflow用户

发布于 2017-06-12 03:09:48

不是的。

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

这就是所谓的Java ,它的设计目的是确保Java1.4二进制文件与Java5VM兼容。

您可以通过在搜索框中搜索"type erasure java“来获取有关这方面的大量信息;例如Avoiding Java Type Erasure

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44487627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档