Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型与继承问题_Java_Generics_Inheritance - Fatal编程技术网

Java 泛型与继承问题

Java 泛型与继承问题,java,generics,inheritance,Java,Generics,Inheritance,我有三门课: public abstract class fileHandler<Key extends Object, Value extends Object> { } public A extends fileHandler<String, String[]> { } public B extends fileHandler<String, String> { } C: D: C、 D和E给出的错误fileHandler是原始类型。对泛型类

我有三门课:

public abstract class fileHandler<Key extends Object, Value extends Object> {
}    

public A extends fileHandler<String, String[]> {
}

public B extends fileHandler<String, String> {
}
C: D:
C、 D和E给出的错误fileHandler是原始类型。对泛型类型fileHandler(键、值)的引用应该参数化。

问题是您试图将实例分配给类名。你应该说

if (condition) {
   file = new A();    
} else {
   file = new B();
}
“file”是这里的引用,“fileHandler”是类名


干杯。

我没有收到编译错误。。。如果我修复了您提供的代码中的所有错误

  class fileHandler<Key, Value> {
    }

  class A extends fileHandler<String, String[]> {
    }

  class B extends fileHandler<String, String> {
    }

当使用不同的类型参数实例化泛型类型时,这两个实例化的类型不兼容。泛型类型的不同实例化不是类型等价的,因为从另一个类继承的类与该类的类型等价,即使类型参数本身可能通过继承而相关。泛型和多态性是两个独立的语言特征

您的代码相当于以下代码:

// Java defaults unspecified type arguments to Object.
fileHandler<Object, Object> file;

if (...) {
   // Error: fileHandler<String, String> is not equivalent to fileHandler<Object, Object>
   file = new fileHandler<String, String>();
} else {
   // Error: fileHandler<String, String[]> is not equivalent to fileHandler<Object, Object>
   file = new fileHandler<String, String[]>();
}
//Java将未指定的类型参数默认为对象。
fileHandler文件;
如果(…){
//错误:fileHandler与fileHandler不等效
file=newfilehandler();
}否则{
//错误:fileHandler与fileHandler不等效
file=newfilehandler();
}
如果您确实希望隔离一个多态接口,该接口独立于用于实例化fileHandler类的类型,那么我建议您使用一个接口:

interface IFileHandler
{
    // If this interface needs to talk about keys and values, it
    // does so using only java.lang.Object.
}

public class fileHandler<Key extends Object, Value extends Object>
    implements IFileHandler
{
    // ...
}

public class A extends fileHandler<String, String>
{
    // ...
}

public class B extends fileHandler<String, String[]>
{
    // ...
}

IFileHandler file;

if (...) {
    file = new A();
} else {
    file = new B();
}
接口处理程序
{
//如果此接口需要讨论键和值,则
//仅使用java.lang.Object执行此操作。
}
公共类文件处理程序
实现IFileHandler
{
// ...
}
公共类A扩展了fileHandler
{
// ...
}
公共类B扩展了fileHandler
{
// ...
}
IFileHandler文件;
如果(…){
file=newa();
}否则{
file=newb();
}

您决定如何修复此警告实际上取决于您尝试执行的操作,以及您希望如何严格限制
gen()
参数的允许类型

示例1

非常宽松

abstract class E {
    public abstract void gen(fileHandler<?,?> A) throws Exception;
}

class C extends E {
    @Override
    public void gen(fileHandler<?,?> A) throws Exception {}
}
示例3

您可能希望命名非限制类型,以便可以引用它

abstract class E {
    public abstract <Value> void gen(fileHandler<String,Value> A) throws Exception;
}

class C extends E {
    @Override
    public <Value> void gen(fileHandler<String,Value> A) throws Exception {}
}
抽象类E{
公共抽象void gen(fileHandler A)抛出异常;
}
C类扩展了E类{
@凌驾
public void gen(fileHandler A)引发异常{}
}

请问,
扩展对象
对什么有用?如果你不大写你的类名,它就不是Java。是的,但我在这方面的格式都错了question@userunknown-removed object编辑原始问题,而不是用重复的问题将站点弄乱。这一点仍然适用。另外,Java类通常使用StudlyCaps(即FileHandler)命名,在这种情况下,接口将包含什么?这非常有用。我用界面重新编写,一切都很完美@用户####:很高兴能为您服务。请在最后回答我关于此错误的最新查询
fileHandler file= null;
if (/* condition */) 
{
    file = new A();
} 
else
{
    file = new B();
}
// Java defaults unspecified type arguments to Object.
fileHandler<Object, Object> file;

if (...) {
   // Error: fileHandler<String, String> is not equivalent to fileHandler<Object, Object>
   file = new fileHandler<String, String>();
} else {
   // Error: fileHandler<String, String[]> is not equivalent to fileHandler<Object, Object>
   file = new fileHandler<String, String[]>();
}
interface IFileHandler
{
    // If this interface needs to talk about keys and values, it
    // does so using only java.lang.Object.
}

public class fileHandler<Key extends Object, Value extends Object>
    implements IFileHandler
{
    // ...
}

public class A extends fileHandler<String, String>
{
    // ...
}

public class B extends fileHandler<String, String[]>
{
    // ...
}

IFileHandler file;

if (...) {
    file = new A();
} else {
    file = new B();
}
abstract class E {
    public abstract void gen(fileHandler<?,?> A) throws Exception;
}

class C extends E {
    @Override
    public void gen(fileHandler<?,?> A) throws Exception {}
}
abstract class E {
    public abstract void gen(fileHandler<String,?> A) throws Exception;
}

class C extends E {
    @Override
    public void gen(fileHandler<String,?> A) throws Exception {}
}
abstract class E {
    public abstract <Value> void gen(fileHandler<String,Value> A) throws Exception;
}

class C extends E {
    @Override
    public <Value> void gen(fileHandler<String,Value> A) throws Exception {}
}