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 {}
}