继承中的Java泛型

继承中的Java泛型,java,generics,Java,Generics,我对java的泛型有一些(哲学上的?)问题 考虑以下几点 public interface ClassA<I> {} public class Obj implements ClassA<String> {} public interface ClassB<I, T extends ClassA<I>> { public I getSomething(); public T getAnotherThing(); } 公

我对java的泛型有一些(哲学上的?)问题

考虑以下几点

public interface ClassA<I> {}

public class Obj implements ClassA<String> {}    

public interface ClassB<I, T extends ClassA<I>> {
    public I getSomething();
    public T getAnotherThing();
}
公共接口ClassA{}
公共类Obj实现类a{}
公共接口类别B{
我得到了一些东西;
公众不能得到其他东西();
}
如果类B的对象被实例化为:

ClassB<String, Obj<String>> o = new ClassB<>();
o.getSomething(); // <-- Returns String
ClassB o=newclassb();
o、 getSomething();// 我认为答案是“不”。)

Java不提供从类型本身提取类型参数的方法,只提供从具有该类型的参数提取类型参数的方法

例如:


但是,正如你所指出的,这也不被接受。Java的语法需要扩展才能实现这一点。

这个例子太琐碎了。如果在<代码> ClassB < /代码>中从未使用或返回类型<代码> t>代码>,那么不要把它放在类声明中。请考虑在该类T(在本例中,Obj)中明确使用方法的方法。我不想让这个例子变得复杂,因为它会把注意力从实际问题上移开。不,你不能这么做。如果要将该方法声明为返回类型,则必须为该类型指定名称,只需添加一个
public T getAnotherThing()
然后您就有了明确使用泛型
T
的代码。真的这么多吗?:)@dhke我想你误读了这个问题-它是
T扩展ClassA
其中
ClassA
!=<代码>类
public interface ClassB<T extends ClassA<I>> { // <-- Won't compile
    public I getSomething(); 
}
ClassB<Obj> o = new ClassB<>(); 
o.getSomething(); // <-- Returns String from Obj declaration, which uses ClassA<String>
class ClassB<T extends ClassA<?>> {
    <I> I getSomething(ClassA<I>) { ... }
}
public interface ClassB<T extends ClassA<I>>