【问题标题】:How to return type of Class for parameterized type [duplicate]如何为参数化类型返回类的类型[重复]
【发布时间】:2017-12-14 04:57:29
【问题描述】:

我的第一次尝试是这样的:

@Override
public Class<? extends Set<Measurement>> getType() {
    Set<Measurement> s = new HashSet<Measurement>();
    return s.getClass();
}

但它不编译:

不兼容的类型:java.lang.Classjava.util.Set 无法转换为 java.lang.Class*?扩展 java.util.Set*mydomain.Measurement**

我的第二次尝试:

@Override
public Class<? extends Set<Measurement>> getType() {
    return Set<Measurement>.class;
}

仍然无法编译:

无法从参数化类型中选择

【问题讨论】:

  • 为什么要这样做?因为type erasure,看不出有用
  • 是的,类型擦除是术语:)

标签: java


【解决方案1】:

嗯,你可以通过扩展泛化类来做到这一点。这将允许编译器保留类型信息。

public class So45012361Application {

    public class Measurement {}

    public class MeasurementsSet extends HashSet<Measurement> {}

    public Class<? extends Set<Measurement>> getType() {
        MeasurementsSet ms = new MeasurementsSet();
        return ms.getClass();
    }

    public static void main(String[] args) {
        System.out.println(new So45012361Application().getType()); //class com.stackoverflow.So45012361Application$MeasurementsSet
        System.out.println(new So45012361Application().getType().getGenericSuperclass()); //java.util.HashSet<com.stackoverflow.So45012361Application$Measurement>
    }
}

【讨论】:

    【解决方案2】:

    以下代码编译运行:

    import java.util.HashSet;
    import java.util.Set;
    
    /**
     * Created by holger on 10.07.2017.
     */
    public class Sandkasten
    {
        public static void main(String[] args)
        {
            new Sandkasten();
        }
    
        public Sandkasten()
        {
            System.out.print(getType());
        }
    
        public Class<? extends Set> getType() { // HERE I made some changes
            Set<String> s = new HashSet<>();
            return s.getClass();
        }
    }
    

    会输出

    class java.util.HashSet
    

    【讨论】:

    • 这和return HashSet.class是一样的
    • 但是如果 getType 应该返回 Class>? (不是 Class extends Set>)
    • &lt;String&gt; 部分在运行时不存在。你不能退货。
    猜你喜欢
    • 2020-11-22
    • 2012-11-25
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2017-04-06
    • 2021-05-01
    • 2012-10-31
    相关资源
    最近更新 更多