繁体   English   中英

我可以获得扩展类并实现接口的对象集合吗?

[英]Can I get a collection of object extending a class and implementing an interface?

基本上没有太多要添加到我的问题中:

class A {}
interface I {}

// how can I get a Set<> of object of type A that implements I?

我尝试了一些<A & I><A extends I><? super A extends I> <? super A extends I>和其他一些,但没有找到任何有用的东西,所以我想知道这是否可行。 如果不是我对它背后的推理感到好奇。

谢谢

Java不支持交集类型,它在声明类型参数时仅支持多个边界(如在extends A & I )。 也就是说,我们不能使用像A & I这样的符号来表示扩展A和I的类型族,但我们可以声明一个类型参数<T extends A & I>来引用特定的类型。

如果后者是你想要的,那么类型参数非常合适。 但是如果你的集合应该承认AI不相关的子类型,似乎不存在好的解决方案。 我最好的想法是像黑客一样:

class AISetWrapper {
    Set<A> set = new HashSet<>();

    <T extends A & I> Set<T> getSet() {
        return (Set<T>) set; // unchecked cast that only works because generics are not reified
    }
}

这将允许我们写:

class AI1 extends A implements I { }

class AI2 extends A implements I { }

public static void main(String[] args) {
    AISetWrapper aiSet = new AISetWrapper();
    aiSet.get().add(new AI1()); // compiles
    aiSet.get().add(new AI2()); // compiles
    aiSet.get().add(new A()); // does not compile
    aiSet.get().add(new I() {}); // does not compile
}

你必须制作一个工具I:

interface I {}
class A implements I {}

Set<A> setOfA;

可能是alsp

class SubA extends A implements I { }
Set <SubA> setOfSubA;

A类的使用不能使它改变它的行为,正如它对I的突然“实施”所表明的那样。接口方法的实现应该从哪里来?

我能够做到以下几点:

public class MyClass<T extends String & Iterable>{
    private Set<T> mySet;
}

public <T extends String & Iterable> void myFancyMethod(Set<T> mySet){}

但是,当我这样做

private Set<? extends String & Iterable>

Syntax error on token "&"遇到Syntax error on token "&"的编译错误。 似乎在声明类型<T>时可以执行&语法,但不能用于通配符<? ...> <? ...>

可以在以下位置找到更好的讨论: Java Generics Wildcarding With Multiple Classes

你可以写自己的课:

public class MySet<E extends A & I> extends HashSet<E> {
    // blank
}

这将简单地确保MySet任何实例仅包含扩展A和实现I对象。

// how can I get a Set<> of object of type A that implements I?

您不能在单个通用语句中保证两者。 你可以做点什么

public void addToSet(I iInstance) {
   if(iInstance instanceof A){  
   //logic to add to your set
    }
}

暂无
暂无

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

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