Bug 102594 - [1.5][compiler] NullPointerException with nested self-referential generics
Summary: [1.5][compiler] NullPointerException with nested self-referential generics
Status: RESOLVED DUPLICATE of bug 101456
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.1   Edit
Hardware: PC Windows XP
: P3 major (vote)
Target Milestone: 3.1.1   Edit
Assignee: Kent Johnson CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-07-03 14:12 EDT by Garret Wilson CLA
Modified: 2005-08-22 08:51 EDT (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Garret Wilson CLA 2005-07-03 14:12:02 EDT
<rant>&@!# Java and it's hacked, kludgy generics! Why couldn't Sun just change
the bytecode and get it over with? And give us a built-in self-referential
generics type? Then I wouldn't even need to try to put Eclipse through such
outrageous hoops...</rant>

I have:

public interface Frame<C extends Frame<C>> extends Box<C>,
ModelComponent<LabelModel, C>
{
}

(I won't go through all the other interfaces, as I'm assuming---hoping---they
are irrelevant to this bug.)

I try to do a:

final Frame<? extends Frame<? extends Frame>>
frame=component.getAncestor(Frame.class);

(Don't even ask why I tried this.)

I get a beautiful error in the IDE, and a log of:

!SUBENTRY 1 org.eclipse.jdt.core 4 1005 2005-07-03 11:08:50.300
!MESSAGE java.lang.NullPointerException
!STACK 0
java.lang.NullPointerException
	at
org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding.implementsInterface(ReferenceBinding.java:681)
	at
org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding.isCompatibleWith(ReferenceBinding.java:766)
	at
org.eclipse.jdt.internal.compiler.lookup.TypeBinding.isTypeArgumentContainedBy(TypeBinding.java:356)
	at
org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding.isEquivalentTo(ParameterizedTypeBinding.java:594)
	at
org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding.isCompatibleWith(ReferenceBinding.java:738)
	at
org.eclipse.jdt.internal.compiler.lookup.Scope.greaterLowerBound(Scope.java:2577)
	at
org.eclipse.jdt.internal.compiler.lookup.CaptureBinding.initializeBounds(CaptureBinding.java:104)
	at
org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding.capture(ParameterizedTypeBinding.java:105)
	at
org.eclipse.jdt.internal.compiler.ast.SingleNameReference.resolveType(SingleNameReference.java:691)
	at
org.eclipse.jdt.internal.compiler.ast.EqualExpression.resolveType(EqualExpression.java:411)
	at
org.eclipse.jdt.internal.compiler.ast.Expression.resolveTypeExpecting(Expression.java:848)
	at org.eclipse.jdt.internal.compiler.ast.IfStatement.resolve(IfStatement.java:222)
	at
org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolveStatements(AbstractMethodDeclaration.java:418)
	at
org.eclipse.jdt.internal.compiler.ast.MethodDeclaration.resolveStatements(MethodDeclaration.java:171)
	at
org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.resolve(AbstractMethodDeclaration.java:396)
	at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1063)
	at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1112)
	at
org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:305)
	at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:560)
	at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:599)
	at
org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:165)
	at
org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:214)
	at
org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.executeOperation(ReconcileWorkingCopyOperation.java:79)
	at
org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:718)
	at
org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:777)
	at
org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1081)
	at
org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy$1.run(JavaReconcilingStrategy.java:98)
	at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1044)
	at org.eclipse.core.runtime.Platform.run(Platform.java:783)
	at
org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:82)
	at
org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:147)
	at
org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy.reconcile(CompositeReconcilingStrategy.java:86)
	at
org.eclipse.jdt.internal.ui.text.JavaCompositeReconcilingStrategy.reconcile(JavaCompositeReconcilingStrategy.java:94)
	at org.eclipse.jface.text.reconciler.MonoReconciler.process(MonoReconciler.java:75)
	at org.eclipse.jdt.internal.ui.text.JavaReconciler.process(JavaReconciler.java:339)
	at
org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:204)

Garret
Comment 1 Philipe Mulet CLA 2005-07-04 03:06:35 EDT
Pls provide complete testcase. It is likely related to interfaces as indicated
by the stack trace.
Comment 2 Kent Johnson CLA 2005-07-04 10:18:20 EDT

*** This bug has been marked as a duplicate of 101456 ***
Comment 3 Michael Albin CLA 2005-08-22 08:51:14 EDT
I know that this bug has been marked as duplicate. But please check this class 
declaration where I get the same internal compiler error. By the way, this 
worked with eclipse 3.1M7.

public class Interval<C extends Comparable< ? super C>>
		implements
			Comparable<Interval< ? extends C>>,
			Cloneable
{
	protected int compareLowerBounds(Interval< ? extends C> other)
	{	
		return 0;
	}

	public int compareTo(Interval< ? extends C> other)
	{
		return compareLowerBounds(other);
	}
}