繁体   English   中英

类抽象和泛型

[英]Class abstraction and generics

我需要扩展一个我无法修改的抽象类:

public abstract class CustomField<T> extends AbstractField<T> implements HasComponents {
    // some code

    @Override
    public abstract Class<? extends T> getType();

    // some code
}

使用这样的泛型类:

public class VerticalCheckBoxSelect<T> extends CustomField<Set<T>> {

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

}

我的问题很明显: VerticalCheckBoxSelect::getType应该返回什么才能编译(并且正确)?

你可以return Class.class.cast(HashSet.class);

哪个会编译,但会给你一个未经检查的分配警告。

说明

你实际做的是某种程度上相当于这个,

public class VerticalCheckBoxSelect<T> extends CustomField<Set> {

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

请注意,在第一行它表示extends CustomField<Set> ,这意味着public abstract Class<? extends T> getType() public abstract Class<? extends T> getType()应该以一种总是返回Class<Set>的方式实现,所以你的实现应该是:

public class VerticalCheckBoxSelect<T> extends CustomField<Set<T>> {

    @Override
    public Class<? extends Set<T>> getType() {
        @SuppressWarnings("unchecked")
        Class<Set<T>> r = (Class) Set.class;
        return r;
    }
}

上面的代码现在完全可以编译。 试试吧!

现在,让我们说,你希望它是任意子类的SetHashSet ,然后更换上述Set.classHashSet.class

public class VerticalCheckBoxSelect<T> extends CustomField<Set<T>> {

    @Override
    public Class<? extends Set<T>> getType() {
        @SuppressWarnings("unchecked")
        Class<Set<T>> r = (Class) HashSet.class;
        return r;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM