![](/img/trans.png)
[英]what is the difference between implementing from an interface and extending from the object class?
[英]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>
来引用特定的类型。
如果后者是你想要的,那么类型参数非常合适。 但是如果你的集合应该承认A
和I
不相关的子类型,似乎不存在好的解决方案。 我最好的想法是像黑客一样:
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.