Java自绑定通用 - java

我有自我约束的泛型,如:

public interface SelfConfigurable<E extends SelfConfigurable<E>> {
    E configure(JsonObject settings);
}

另一个接口也具有通用类型,它扩展了我以前的接口:

public interface ConfigurableSegmentFilter<T> extends SegmentFilter<T>, SelfConfigurable<ConfigurableSegmentFilter<T>> {
}

我也有这样的实现

public abstract class ConfigurableSegmentFilterSkeleton<T> implements ConfigurableSegmentFilter<T> {
    @Override
    public ConfigurableSegmentFilter<T> configure(JsonObject settings) {
     ... }
}

我通过反射实例化对象,并想在添加到列表之前对其进行配置:

List<ConfigurableSegmentFilter<?>> result = ...

ConfigurableSegmentFilter newFilter = Reflection.newInstance() + casting

result.add(newFilter.configure(...)); <-- compile error 'cannot be applien to SelfConfigurable' but why?

//when i call to configure directly i am getting:
SelfConfigurable configure = newFilter.configure(...) <-- why SelfConfigurable??

而且我得到一个编译错误!它告诉我xxx.configure()返回SelfConfigurable接口而不是ConfigurableSegmentFilter,我无法理解为什么会这样。

还有一件事,当我用通配符限制newFilter时,事情开始按预期工作

List<ConfigurableSegmentFilter<?>> result = ...

ConfigurableSegmentFilter<?> newFilter = ... //<-- bound with <?>

result.add(newFilter.configure(...)); <-- No error! But why?

ConfigurableSegmentFilter vs ConfigurableSegmentFilter<?>的唯一区别

参考方案

“原始”类型与将类型参数设置为“对象”的泛型类型并不相同。

这样做的原因是为了避免运行时强制转换异常。

因此,例如,考虑一个涉及'java.util.List'类的简单方案:

List a = ... # a elements could be a mix of any type.
List<?> b = ... # b elements are all instance of a known class '?'.
List<Object> c = ... # c elements are all instances of Object.
List<String> d = ... # d elements are all instances of String.

应当明确为什么将元素从任何其他列表移动到'd'的操作一定是有问题的,因为不能保证这些元素是'String's

但是,其他连击又如何呢?

a,c或d-> b。

b.addAll(c); // error!!!

'?'这里表示一个未知类型...例如,它可以是String,在这种情况下,我们回到明显的情况c-> d。之所以有此限制,是为了防止在实际知道集合类型参数(例如String)并正在使用该元素的其他代码片段拉出非字符串实例而导致运行时强制转换时阻止运行时异常。 。
b,a,d-> c或b,c,d-> a。

毕竟,允许吗?所有实例都是“对象”,所以没有问题。一个

还要注意,给我分配一些参考是一个问题(至少是警告):

   c = a; // unchecked warning; 
   c = d; // error as now you would be able to add non-strings to 'd' thru 'c'.
   c = b; // error, same as above where the the element type is unknown.
   a = d; a = b; // same as with 'c'.
   d = c; d = a; // error for obvious reason. 

具有相同基类的泛型 - java

我有一个这样定义的TreeNode类:class TreeNode<T extends MyClass> { public T element; public TreeNode<? extends MyClass> parent; public ArrayList<TreeNode<? extends MyClass>…

Java中的“ <<”运算符 - java

最喜欢的语句来自Java的Character类:(1 << Character.PARAGRAPH_SEPARATOR)) >> type PARAGRAPH_SEPARATOR是字节,type是整数。这句话中的操作员,他们做什么?如何以及在哪里可以使用这些运算符?这是oracles java.lang.Character文档。该类中…

为什么调用具有不同类型的通用方法会导致编译错误? - java

我正在尝试学习Java泛型。我写了一个方法:public <T> T Gmethod(T a,Collection<T> list){ return a;} 用Gmethod("A",list);调用它很好,其中list是Object的类型,但是用Gmethod(new Object(),list);调用它,其中l…

JAVA:如何检查对象数组中的所有对象是否都是子类的对象? - java

我有一个对象数组。现在,我要检查所有这些对象是否都是MyObject的实例。有没有比这更好的选择:boolean check = true; for (Object o : justAList){ if (!(o instanceof MyObject)){ check = false; break; } } java大神给出的解决方案 如果您不喜欢循环,则…

用glassfish服务器进行struts2会话维护 - java

在我的应用程序中,有5分钟的会话超时。<session-config> <session-properties> <property name="timeoutSeconds" value="300"></property> </session-properties…